我正在使用 FakeItEasy 库为我的单元测试创建假货。
我有一个ClassUnderTest
我想测试该方法MethodToTest(Data dataObject)
。这个方法正在调用我想伪造的接口的方法:
public interface IFoo
{
void Execute(Action<IDataAccess> 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; }
}
在我的单元测试中,我想检查测试方法是否正确调用接口(使用正确的属性值):
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var foo = A.Fake<IFoo>(x => x.Strict());
A.CallTo(() => foo.Execute(dataAccess => dataAccess.Update(A<Data>.That.Matches(d => d.Property == 20))));
var cut = new ClassUnderTest(foo);
cut.MethodToTest(new Data { Property = 20 });
}
}
但在这个测试中有些配置是错误的。我得到了例外:
测试方法 TestProject1.UnitTest1.TestMethod1 抛出异常:
FakeItEasy.ExpectationException:调用严格伪造的非配置方法“执行”。
有人知道我必须如何配置CallTo()
表述正确吗?
更新后的示例确实有帮助,@rhe1980。
首先,关于您提供的测试的一些注释:
- the
A.CallTo
方法不执行任何操作 - 它没有设置行为(使用.Invokes
or a .Returns
甚至是一个.DoesNothing
)或验证该方法是否已被调用(例如.MustHaveHappened
).
- 比较
Action
s 似乎很难。我确实找到了一些建议比较委托操作 https://stackoverflow.com/questions/6701041/compare-delegates-actiont,但如果是我,我会采取稍微不同的策略。
而不是尝试比较Action
委托给参考模型,我想我可以通过捕获提供给的操作来模拟这一点Execute
然后在IDataAccess
并看到该动作的作用是什么。幸运的是,我们有 FakeItEasy 来帮助解决这个问题!
我在这个测试中取得了成功:
[TestMethod]
public void TestMethod1()
{
// Arrange
var foo = A.Fake<IFoo>(x => x.Strict());
var fakeDataAccess = A.Fake<IDataAccess>();
A.CallTo(() => foo.Execute(A<Action<IDataAccess>>.Ignored))
.Invokes((Action<IDataAccess> action)=>action(fakeDataAccess));
var cut = new ClassUnderTest(foo);
// Act
cut.MethodToTest(new Data { Property = 20 });
// Assert
A.CallTo(() => fakeDataAccess.Update(A<Data>.That.Matches(d => d.Property == 20)))
.MustHaveHappened();
}
我希望它有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)