C# 应在模拟上调用一次,但调用次数为0次

C# 应在模拟上调用一次,但调用次数为0次,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我需要在AddOrEdit方法中定义它触发了另一个Add方法。add方法添加一个新实例。但是我发现了错误。Add方法在debug中工作。我做错了什么 var repository = new Mock<IRepository>(); var layer = new Layer(repository.Object); // Arrange var object1=new Object1(); var object2=new Object2(); repository.Setup(a

我需要在AddOrEdit方法中定义它触发了另一个Add方法。add方法添加一个新实例。但是我发现了错误。Add方法在debug中工作。我做错了什么

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"});
}
var repository=newmock();
var层=新层(repository.Object);
//安排
var object1=new object1();
var object2=new object2();
Setup(a=>a.Add(newobject1(){Name=“Name”}));
//表演
layer.AddOrEdit(object1,object2);
//断言
Verify(a=>a.Add(newobject1(){Name=“Name”}));
public void AddOrEdit(Object1 Object1,Object2 Object2))
{
......
......
添加(object2.Name)
}
公共无效添加(字符串名称)
{
Add(newObject1(){Name=“Name”});
}
更新:

我搬走了

repository.Setup(a => a.Add<Object1>(new Object1(){Name="Name"}));
repository.Setup(a=>a.Add(newobject1(){Name=“Name”}));
和覆盖等于

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
public override bool Equals(对象对象对象)
{
var item=obj作为Object1;
返回项!=null&&this.Name.Equals(item.Name);
}
验证(a=>a.Add(newobject1(){Name=“Name1”}));//测试失败
验证(a=>a.Add(newobject1(){Name=“Name”}));//测试成功
更新2 提供了更好的解决方案


repository.Verify(a=>a.Add(It.Is(y=>y.Name==“Name”))

我认为在您的验证呼叫中,您应该使用

It.Is(y=>y.Name==“Name”)


这将验证调用,并且您不需要仅为了测试目的而重写类中的equals。

您的
Object1
类型是否重写equals?如果没有,则调用的是
Add
,参数与预期参数不同..Thx。○verride等于解决了问题。您确定正确实现了类吗?Add方法不使用name参数。是的,我确定。测试的行为正确无需仅为了测试而重写类中的等式。请参阅我的答案,它使用Moq.Thx的内置功能。这总比你强