2017-04-24 17 views
0

私はC#でいくつかのユニットテスト/ BDDテストを行うためにMoQを使用していますが、私はしばしば同じオブジェクトを2回生成する必要があります。または何か99%同じものだが、ちょうど異なるIDを持つもの。同じモックの2つのオブジェクトを生成する

モック定義を「クローン」する方法はありますか?または同じ定義を持つ2つのオブジェクトを生成するには?

+1

書き込みaを示唆しているとdatabuilderの間、あなたにもAutoFixtureと部品番号を使用することができますメソッドを使ってモックを構築する –

答えて

0

Mockオブジェクトを構築するためのいくつかのパラメータを取るようなヘルパーメソッドを作成する必要があります。

[Test] 
public void MyTest() 
{ 
    Mock<ITestObject> myMock = CreateObject(1); 
    ITestObject obj = myMock.Object; 
} 

private Mock<ITestObject> CreateObject(int id) 
{ 
    Mock<ITestObject> mock = new Mock<ITestObject>(); 
    mock.SetupGet(o => o.ID).Returns(id); 
    return mock; 
} 

private interface ITestObject 
{ 
    int ID { get; set; } 
} 
+0

はい、私はこれをやったのですが、まったく同じモックを持っていれば、2つのモックを作ることは必須ですか? – J4N

+0

モックタイプにはコピー/クローン機能がありません。また、 '[Serializable]'としてマークされていないので、これが最適な解決策です。 – Matthiee

+0

さて、私はちょっと疑問に思っていましたが、その影響は巨大ではありませんでしたが、私はこれをよりよく見つけました。 – J4N

0

単体テストに必要なデータのコレクションが必要な場合は、AutoFixtureも同様に考慮する必要があります。あなたが嘲笑したいクラスの場合、Moqと連携することができます。 AutoFixtureにYourClassの作成方法を教え、 "私のIDは大文字でX個以下の文字列でなければなりません"のようなルールを設定することさえできます。

次に、autofixtureを使用します。

var fixture = new Fixture(); 
var tetsClasses = fixture.CreateMany<TestClass>(); 

これは本当にあなたにアイデアを与えることです。あなたはかなり多くを行うことができますが、それはMoqにとって本当にうまくいきます。

データビルダーパターンを使用してデータを作成する方法もあります。だから、単純なものから始めて、データをどのように構築する必要があるかについての最新の事例を見つけながら、その上に追加し続けることができます。それに流暢なAPIを構築し、必要なデータを構築するだけです。あなたがしたい場合は、リストを構築するためにそれを拡張することができます

var stubOne = TestClassBuilder.WithId(1).Build(); 

internal class TestClassBuilder<T> : where T : TestClass 
{ 
    int Id {get; set;} 

    public T WithId(int id) 
    { 
    this.Id = id; 
    return this; 
    } 

    public virtual T Build() 
    {  
     return new T() 
     { 
      if(this.Id) 
       Id = this.Id; // if you chose to set it, then assign it 
      else 
      Id = GetRandomId() // you can figure a solution here 
     } 
    } 
} 

次にようにそれを呼び出します。

データ作成者は流暢なAPIが好きです。作成した方法でストーリーを伝えることができ、アレンジセクションが整然と整った状態に保たれるためです。 例:

var UnderAgeCustomer = new CustomerBuilder 
         .UnderAge 
         .WithFakeId 
         .InACrowd 
         .LooksYoung 
         .Build() 

あなたも

public static implicit operator T(TestClassBuilder<T> builder) 
{ 
    return builder.Build(); 
} 

に追加することができますそして、あなたは(私はビルドが不要なノイズを付加思う)すべての時間.Build()の部分を使用する必要はありません。それをvarに代入しようとしないで、動作しません。

TestClass MockTwo = TestClassBuilder.WithId(2); 

私はあなたにも、このすべての追跡するために、フィクスチャのパターンを使用することができますと言うだろう...しかし、私は:)

関連する問題