如何使用FakeItEasy声明选择的呼叫

时间:2012-12-06 12:53:33

标签: c# unit-testing fakeiteasy

使用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维基上找不到任何东西。

2 个答案:

答案 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?关键不应分为不同的测试吗?也许我在这里没有足够的关于你的案例的信息。