C# 如何使用FakeiTesy验证方法参数以及是否已进行调用

C# 如何使用FakeiTesy验证方法参数以及是否已进行调用,c#,fakeiteasy,C#,Fakeiteasy,我正在使用FakeiTasy进行一些测试,但我遇到了一个问题。 在测试预期数据是否发送到伪造服务时,我希望能够看到错误数据。 现在我只看到电话从未发生过。 也许我的设置全错了,但我想知道一些如何纠正的提示。:) 我的情况是: 使用不同的值对同一服务进行两次调用。 我需要单独的测试来验证每个调用。 如果任何参数没有预期值,我希望得到一条错误消息,说明这一点。与执行Assert.AreEqual()时类似 现在我只收到“电话没有发生”,这是完全可以理解的,因为我意识到这就是我正在测试的。但我希望能够

我正在使用FakeiTasy进行一些测试,但我遇到了一个问题。 在测试预期数据是否发送到伪造服务时,我希望能够看到错误数据。 现在我只看到电话从未发生过。 也许我的设置全错了,但我想知道一些如何纠正的提示。:)

我的情况是: 使用不同的值对同一服务进行两次调用。 我需要单独的测试来验证每个调用。 如果任何参数没有预期值,我希望得到一条错误消息,说明这一点。与执行Assert.AreEqual()时类似

现在我只收到“电话没有发生”,这是完全可以理解的,因为我意识到这就是我正在测试的。但我希望能够验证一个特定的调用只进行了一次,如果没有发生,我希望看到使用了哪些值来避免它发生

我使用了这个解决方案: 当我只有一个电话,但有两个电话,它不工作

 [TestFixture]
public class TestClass
{
    [Test]
    public void TestOne()
    {
        // Arrange
        var fake = A.Fake<IBarservice>();
        var a = new Foo(fake);

        // Act
        a.DoStuff(1);

        //Assert
        A.CallTo(() => fake.DoOtherStuff(A<int>.That.Matches(x => x == 2))).MustHaveHappened(Repeated.Exactly.Once);
    }

    [Test]
    public void TestTwo()
    {
        // Arrange
        var fake = A.Fake<IBarservice>();
        var a = new Foo(fake);

        // Act
        a.DoStuff(1);

        //Assert
        A.CallTo(() => fake.DoOtherStuff(A<int>.That.Matches(x => x == 3))).MustHaveHappened(Repeated.Exactly.Once);
    }
}

public class Foo
{
    private readonly IBarservice _barservice;

    public Foo(IBarservice barservice)
    {
        _barservice = barservice;
    }

    public void DoStuff(int someInt)
    {
        someInt++;
        _barservice.DoOtherStuff(someInt);
        // I should have increased someInt here again, but this is a bug that my tests catches
        _barservice.DoOtherStuff(someInt);
    }
}

public interface IBarservice
{
    void DoOtherStuff(int someInt);
}
[TestFixture]
公共类TestClass
{
[测试]
公共void TestOne()
{
//安排
var fake=A.fake();
var a=新Foo(假);
//表演
a、 多斯塔夫(1);
//断言
A.CallTo(()=>false.DoOtherStuff(A.That.Matches(x=>x==2)))。必须发生(重复。准确地说。一次);
}
[测试]
公共测试二()
{
//安排
var fake=A.fake();
var a=新Foo(假);
//表演
a、 多斯塔夫(1);
//断言
A.CallTo(()=>false.DoOtherStuff(A.That.Matches(x=>x==3))。必须已经发生(重复。精确。一次);
}
}
公开课Foo
{
专用只读IBarservice(uBarService);
公共食品(IBarservice barservice)
{
_酒吧服务=酒吧服务;
}
公共无效数据集(int-someInt)
{
someInt++;
_酒吧服务。DoOtherStuff(someInt);
//我应该在这里再次增加一些int,但这是我的测试捕捉到的一个bug
_酒吧服务。DoOtherStuff(someInt);
}
}
公共接口IBarservice
{
void DoOtherStuff(int someInt);
}

Markus,我有一条评论,我已经修改过了,因为我犯了一个错误

你说你只收到“电话没有发生”和

…我希望能够验证某个特定调用只进行了一次,如果没有发生,我希望查看使用了哪些值来避免它发生

恐怕我不明白您想要什么信息,因为当我运行
TestOne
时,我得到了

FakeItEasy.ExpectationException

  Assertion failed for the following call:
    FakeItEasyQuestionsVS2015.IBarservice.DoOtherStuff(<x => (x == 2)>)
  Expected to find it exactly once but found it #2 times among the calls:
    1: FakeItEasyQuestionsVS2015.IBarservice.DoOtherStuff(someInt: 2) repeated 2 times
    ...
fakeitesy.ExpectationException
以下调用的断言失败:
FakeItEasyQuestionsVS2015.IBarservice.DoOtherStuff((x==2)>)
预计只会找到一次,但在电话中发现了两次:
1:FakeiTeasyQuestions SVS2015.IBarservice.DoOtherStuff(someInt:2)重复2次
...
这表示调用
DoOtherStuff
两次,每次都将
someInt
作为值
2
传入