2012-02-29 15 views
3

単体テストに戸惑いがありますので、簡単な例を挙げて問題を説明しました。私は、次の...Moqを使って助けが必要

public class SomeClass : ISomeInterface 
    { 
     public int ID { get; set; } 
     public string Desc { get; set; } 

     public int Create(SomeClass t) 
     { 
      return 5; 
     } 

     public int Create2(string s) 
     { 
      return 7; 
     } 
    } 

    public interface ISomeInterface 
    { 
     int Create(SomeClass t); 
     int Create2(string s); 
    } 

は今、私は嘲笑インターフェース

private void TestCreate() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create(new SomeClass())).Returns(3); 
     var result = mocker.Object.Create(new SomeClass()); 
    } 

    private void TestCreate2() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create2("Test")).Returns(4); 
     var result = mocker.Object.Create2("Test"); 
    } 

TestCreate2が嘲笑結果が「4」
TestCreateしかし代わりに「0」を返す動作し、返しをテストするための2つのメソッドを持っています"3"

カスタムクラスを引数として受け入れ、単純なintや文字列ではないメソッドを疑似できるようにするには、何が必要ですか?

答えて

3

ええ、セットアップコール中に渡されたSomeClassのインスタンスを取得したときに3を返すようにTestCreateを設定しているからです。ただし、インスタンスをインラインで新規作成するので、実際のCreateコールで渡されたインスタンスは同じではありません。どちらのオプションも問題を解決します...

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    mocker.Setup(x => x.Create(It.IsAny<SomeClass>())).Returns(3); 
    var result = mocker.Object.Create(new SomeClass()); 
} 

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    var someClass = new SomeClass(); 
    mocker.Setup(x => x.Create(someClass)).Returns(3); 
    var result = mocker.Object.Create(someClass); 
}