应调用mock一次,但实际为0次

本文关键字:0次 调用 mock 一次 | 更新日期: 2023-09-27 18:23:58

我需要定义在方法AddOrEdit中触发了一个不同的方法Add。add方法添加一个新实例。但我发现了错误。Add方法在调试中起作用。我做错了什么?

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"}));

并覆盖等于

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

更新2Andy提供了更好的解决方案

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

应调用mock一次,但实际为0次

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

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

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