c# - 构造函数使用模拟对象,如何隔离测试方法?

标签 c# unit-testing moq

我有一个看起来像这样的类:

class MyClass {

  private IDependency dep;

  public MyClass(IDependency dep) {
    this.dep = dep;
    this.dep.Reset();
  }

  public void Clear() {
    this.dep.Reset();
  }
}

如何在忽略构造函数的作用的情况下测试在 Clear 方法中是否正确调用了 Reset 方法?

我的最小起订量测试如下所示:

MockRepository mocks = new MockRepository(MockBehavior.Default);
var dep = mocks.Create<IDependency>();

dep.Setup(s => s.Reset());

MyClass myclass = new MyClass(dep.Object);
myclass.Clear():

state.Verify(s => s.Reset(), Times.Exactly(1));

失败是因为 Reset 被调用了两次(一次在构造函数中,一次在 Clear 方法中)。

最佳答案

我希望有更好的方法,但模拟会记录所有对 Reset 的调用,因此使用标准的 Verify 调用将始终返回 2。下面维护一个单独的柜台,这不是很优雅。如果 Moq 有内置的方法来执行此操作,我很想知道。

int clearResetCount = 0;

Mock<IDependency> dep = new Mock<IDependency>();

MyClass myclass = new MyClass(dep.Object);

dep.Setup(s => s.Reset()).Callback(() => clearResetCount++);

Assert.AreEqual(0, clearResetCount, "Expected clear reset count - before.");

myclass.Clear();

Assert.AreEqual(1, clearResetCount, "Expected clear reset count - after.");

关于c# - 构造函数使用模拟对象,如何隔离测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769676/

相关文章:

c# - 有没有办法停止 DataGridViewCheckBoxColumn 单击时自动检查?

c# - 绑定(bind) DataGridComboBoxColumn

c# - 如何验证是否调用了两种方法中的一种?

c# - 预期对模拟调用一次,但为 0 次 未执行任何调用

c# - 重构和模拟以支持单元测试

c# - WCF ServiceHost 似乎为每条消息调用 CustomCertificateValidator

c# - 如何从另一个窗体将焦点设置到主窗体中的对象(文本框)(C#)

python - Django setUpTestData() 与 setUp()

PHPUnit:数据提供者问题

java - 如何模拟从抽象类继承的 protected 子类方法?