【问题标题】:Expected invocation on the mock once, but was 0 times预期在模拟上调用一次,但为 0 次
【发布时间】:2013-07-20 11:32:00
【问题描述】:

我需要在 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"}));

并覆盖 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

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

repository.Verify(a =&gt; a.Add(It.Is&lt;Object1&gt;(y =&gt; y.Name == "Name")));

【问题讨论】:

  • 您的 Object1 类型是否覆盖 Equals?如果没有,您正在调用 Add 并使用与您期望的参数不同的参数..
  • 谢谢。 Оverride Equals 解决了问题。
  • 你确定你正确地实现了你的类吗? add 方法不使用 name 参数。
  • 是的,我确定。测试行为正常
  • 不需要在你的类中重写 equals 只是为了测试。请参阅我的答案,它使用 Moq 的内置功能。

标签: c# .net unit-testing mocking moq


【解决方案1】:

我认为在您的验证电话中您应该使用

It.Is&lt;Object1&gt;(y =&gt; y.Name == "Name")

这应该会验证调用,并且您不需要仅仅为了测试目的而在类中覆盖 equals。

【讨论】:

  • 谢谢。它比覆盖等于更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多