2011-04-13 66 views
1

是否可以檢查發送到Mocked方法的對象的屬性是什麼?例如我有:使用Moq檢查傳回給模擬的對象的屬性

public class Foo 
{ 
    int SomeNumber {get; set;} 
} 

public class ReceivesFoo: IReceivable 
{ 
    public void Process(Foo foo) 
    { 
    } 
} 

public class Bar 
{ 
    private IReceivable receiver; 

    public void SomeMethod(int b) 
    { 
     Foo foo = new Foo(); 
     if (b == 0) 
     { 
      foo.SomeNumber = 12; 
     } 
     else 
     { 
      foo.SomeNumber = 7; 
     } 
     receiver.Process(foo); 
    } 
} 

public class TestBar 
{ 
    public void ZeroReceives12() 
    { 
     mockReceivable.Setup(x => x.Process(It.IsAny<Foo>()); 
     bar.SomeMethod(0); 
    } 
} 

這是一個相當簡化,但希望你知道我在得到什麼。我知道在方法中創建一個新類是一個壞主意。所以這是在某種工廠的其他地方完成的。但是設置新對象的各種屬性的所有邏輯都是在這個方法中完成的。因爲將該邏輯放在工廠中是沒有意義的,因爲它與工廠無關,而且事情會根據Bar的狀態而改變。

所以基本上我只是希望能夠做的不僅僅是驗證嘲笑的接收器會收到某種Foo。我想確保它獲得美孚的一個實例,其SomeNumber被設置爲12。

回答

1

這是給你一個很好的參考... https://github.com/Moq/moq4/wiki/Quickstart

基本上你想這樣的事情...

public void ZeroReceives12() 
{ 
    int input; 

    mockReceivable.Setup(x => x.Process(It.IsAny<Foo>()) 
       .Callback(y => foo = y); 

    bar.SomeMethod(0); 

    // ensure input is what you expect 
} 
+0

我編輯我的代碼樣本爲僞代碼是垃圾 – BenCr 2011-04-13 15:59:26

+0

不需要編輯。我建議回調後收到它。該文檔不是很好解釋回調解決什麼問題。我試圖使用SetupProperty來跟蹤存根的值。但是我不喜歡那個,因爲這意味着我的所有屬性都必須是虛擬的。 – uriDium 2011-04-13 16:04:19