如何使用FakeItEasy伪造一个动作

我正在使用FakeItEasy库为我的unit testing创​​建假货。

我有一个ClassUnderTest ,我想在其上测试方法MethodToTest(Data dataObject) 。 这个方法调用一个我想伪造的接口的方法:

 public interface IFoo { void Execute(Action action); } public class ClassUnderTest { private IFoo _foo; public ClassUnderTest(IFoo foo) { _foo = foo; } public void MethodToTest(Data dataObject) { _foo.Execute(dataAccess => dataAccess.Update(dataObject)); } } public interface IDataAccess { void Update(Data data); } public class Data { public int Property { get; set; } } 

在我的unit testing中,我想检查测试方法是否正确调用接口(具有正确的属性值):

 [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { var foo = A.Fake(x => x.Strict()); A.CallTo(() => foo.Execute(dataAccess => dataAccess.Update(A.That.Matches(d => d.Property == 20)))); var cut = new ClassUnderTest(foo); cut.MethodToTest(new Data { Property = 20 }); } } 

但是在这个测试中配置错误。 我得到了例外:

测试方法TestProject1.UnitTest1.TestMethod1抛出exception:FakeItEasy.ExpectationException:调用严格假的非配置方法“Execute”。

有人知道如何正确配置CallTo()语句吗?

提前致谢!

更新的例子真有帮助,@ rhe1980。

首先说明您提供的测试:

  1. A.CallTo方法不做任何事情 – 它不是设置行为(使用.Invokes.Returns甚至是.DoesNothing )或validation方法已被调用(例如使用.MustHaveHappened )。
  2. 比较Action似乎很难。 我确实在Compare Delegates Action 上找到了一些建议,但如果是我,我会采取稍微不同的方法。

我没有尝试将Action委托与参考模型进行比较,而是认为我可以通过捕获提供给Execute的操作然后在IDataAccess上运行它来模拟这一点,并查看操作的作用 。 幸运的是,我们有FakeItEasy来帮助解决这个问题!

我在这个测试中取得了成功:

 [TestMethod] public void TestMethod1() { // Arrange var foo = A.Fake(x => x.Strict()); var fakeDataAccess = A.Fake(); A.CallTo(() => foo.Execute(A>.Ignored)) .Invokes((Action action)=>action(fakeDataAccess)); var cut = new ClassUnderTest(foo); // Act cut.MethodToTest(new Data { Property = 20 }); // Assert A.CallTo(() => fakeDataAccess.Update(A.That.Matches(d => d.Property == 20))) .MustHaveHappened(); } 

我希望它有所帮助。

如果我理解你的意图,你需要使用如下内容:

 A.CallTo(() => foo.Execute(A>.Ignored).MustHaveHappened();