使用FakeItEasy,如何判断,是否已发生任何呼叫?
用例是我正在编写一个与存储库一起工作的类,并且作为方法的结果,该类应该通过调用DeleteAll或通过为所有这些元素调用Delete来从存储库中删除一些元素。
现在,我已经使用了这样的试用:
try // either
{
A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[0]))).MustHaveHappened();
A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[1]))).MustHaveHappened();
}
catch (ExpectationException) // or
{
A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[0]))).MustHaveHappened();
A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[1]))).MustHaveHappened();
}
但我不喜欢这样,如果有更多的选择,很快就会变得非常丑陋。有没有更好的办法?我在FakeItEasy维基上找不到任何东西。
答案 0 :(得分:2)
以下是一个示例,说明如何验证是否在假对象上调用了一个或多个方法。
public interface IBlah
{
void Delete(int x);
int Add(int x, int y);
int Subtract(int x, int y);
}
public class Something
{
private readonly IBlah _blah;
public Something(IBlah blah) { _blah = blah; }
public void DoSomething(int x, int y )
{
// _blah.Add(x, y);
_blah.Subtract(x, y);
}
}
以上只是一个简单的测试系统
[Fact]
public void TestFeature()
{
var fake = A.Fake<IBlah>();
var something = new Something(fake);
something.DoSomething(1, 2);
var callResults = Fake.GetCalls(fake).Any(call =>
{
var x = call.GetArgument<int>("x");
var y = call.GetArgument<int>("y");
return call.Method.Name == "Add" || call.Method.Name == "Subtract"
&& x == 1 && y == 2;
});
Assert.True(callResults);
}
上面的上面的直接片段是一个XUnit测试,用于验证是否使用参数x = 1,y = 2
的给定值调用了Add或Subtract答案 1 :(得分:1)
不确定你是否可以用FakeItEasy做到这一点老实说,你可以编写一个扩展方法来让你的代码看起来更“漂亮”,虽然我同意它不是一般的好解决方案。
我真正想说的是,通过单元测试你正在测试确定性行为,所以通过输入方法不应该知道是否应该调用Delete或DeleteAll?关键不应分为不同的测试吗?也许我在这里没有足够的关于你的案例的信息。