2017-12-28 21 views
1

クラスの2つのモックオブジェクトを作成しようとしましたが、同じアセンブリ "FullName"を持つ2つのモックを作成します。Rhino.Mocks:異なるアセンブリフルネームのクラスのスタブを作成する方法

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 
{ 
    public MyClassA(string someData) : base(someData) 
    { 
     //this property defined in base class 
     CheckId = GetType().FullName; 
    } 

    internal override string CheckId { get; } 
} 

public class TestClass 
{ 
    [Test] 
    public void TestMethod() 
    { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 

上記のアサーションは真であり、私は間違っていると予想しました。

CheckIdを提供する別のインターフェイスを作成できますが、実動コードで同じ環境を作成したいと思います。

私の質問は、CheckIdプロパティが異なる場合でも、Rhinoモックが異なるオブジェクトに対して同じクラス名を生成する理由です。

テストロジックを変更せずに同じクラスの異なる模擬インスタンスを作成する方法はありますか?

他の詳細が必要な場合はお知らせください。前もって感謝します。

UPDATE:私は手動でプロパティを更新するよりも、より良い解決策を見つけた

を解決しました。一般的なタイプのMyClassAを作成することで、この問題が解決されます。あなたが以下で見ることができるように;

public class MyClassA<TDummy> : SomeAbstractClass, ISomeInterface1, ISomeInterface2 
{ 
    public MyClassA(string someData) : base(someData) 
    { 
     //this property defined in base class 
     CheckId = GetType().FullName; 
    } 

    internal override string CheckId { get; } 
} 

public class TestClass 
{ 
    [Test] 
    public void TestMethod() 
    { 
     var mock1 = MockRepository.GenerateMock<MyClassA<int>>("some data 1"); 
     var mock2 = MockRepository.GenerateMock<MyClassA<bool>>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 

異なるダミータイプのため、生成されたモックはすべて同じベースタイプの異なるインスタンスです。そして、私が期待したように、すべての主張は偽です。

+0

これは反射の誤解です。アサーションは正しいです。反映されたときに作成される2つのクラスは、同じタイプを提供します。 – Nkosi

+0

私の目標は、さまざまなチェックID(クラスfullnameを参照)を持つ2つのモックインスタンスを作成することです。しかし私がバックグラウンドで理解しているように、モックロジックはリフレクション中に同じタイプの同じクラス名を生成します。 –

答えて

0

1つのオプションは、クラスをからかったときに反射がある場合

public class TestClass { 
    [Test] 
    public void TestMethod() { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1", "checkId 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassA>("some data 2", "checkId 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); //Should fail. 
    } 
} 

そうでない場合は、そのプロパティを設定するコントロールを持っていることが

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    public MyClassA(string someData, string checkId) : base(someData) { 
     //this property defined in base class 
     CheckId = checkId; 
    } 

    internal override string CheckId { get; } 
} 

そのように一意であることができるように手動でプロパティを設定することですあなたが複数のクラスを作ることを賭けることになるでしょう。

public class MyClassA : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    //... 
} 

public class MyClassB : SomeAbstractClass, ISomeInterface1, ISomeInterface2 { 
    //... 
} 

public class TestClass { 
    [Test] 
    public void TestMethod() { 
     var stub1 = new MockRepository().StrictMock<MyClassA>("some data 1"); 
     var stub2 = new MockRepository().StrictMock<MyClassB>("some data 2"); 

     Assert.AreEqual(stub1.CheckId, stub2.CheckId); 
    } 
} 
+1

これは私の心に来た最初の解決策でした。しかし、同じクラスの異なるモックを作ることが可能かどうか分からなかったので、私はそれを求めようとしました。インターネットで私は満足のいく答えを見つけることができませんでした。とにかくフィードバックに感謝します。どうやら、私はプロパティを手動で設定する以外の機会はありません。 –

関連する問題