2013-07-20 52 views
1

我需要定義在AddOrEdit方法中觸發了不同的方法Add。 add方法添加一個新實例。但是我發現了這個錯誤。 Add方法在調試中起作用。我究竟做錯了什麼?期望調用模擬一次,但是0次

var repository = new Mock<IRepository>(); 
var layer = new Layer(repository.Object); 

// Arrange 
var object1=new Object1(); 
var object2=new Object2(); 
repository.Setup(a => a.Add<Object1>(new Object1(){Name="Name"})); 

// Act 
layer.AddOrEdit(object1, object2); 

// Assert 
repository.Verify(a => a.Add<Object1>(new Object1(){Name="Name"})); 

public void AddOrEdit(Object1 object1, Object2 object2)) 
{ 
    ...... 
    ...... 
    Add(object2.Name) 
} 
public void Add(string name) 
{ 
    Repository.Add(new Object1(){Name="Name"}); 
} 

更新:

我刪除

repository.Setup(a => a.Add<Object1>(new Object1(){Name="Name"})); 

而忽略equals

public override bool Equals(object obj) 
{ 
    var item = obj as Object1; 

    return item != null && this.Name.Equals(item.Name); 
} 

repository.Verify(a => a.Add<Object1>(new Object1(){Name="Name1"})); // Test Failed 
repository.Verify(a => a.Add<Object1>(new Object1(){Name="Name"})); // Test Success 

UPDATE2 Andy提供了一個更好的解決方案

repository.Verify(a => a.Add(It.Is<Object1>(y => y.Name == "Name")));

+1

你的'Object1'類型是否覆蓋Equals?如果不是這樣,你可以用另一個參數來調用'Add',這個參數就是你所期待的那個.. –

+0

Thx。 ОverrideEquals解決了問題。 – user2602098

+0

你確定你正確實施了你的班級嗎? Add方法不使用name參數。 –

回答

2

我想在你的驗證叫你應該使用

It.Is<Object1>(y => y.Name == "Name")

這應該確認來電,你就不會需要重寫你的類的equals僅用於測試目的。

+0

Thx。這比覆蓋等於好 – user2602098

相關問題