首页 > 解决方案 > 断言乐趣被调用

问题描述

给定以下类,我如何测试何时MethodUnderTestGetSomething调用?

public class SystemUnderTest
{
    private Foo foo;

    public string MethodUnderTest(int input)
    {
       return foo.Get(x => x.GetSomething(input));
    }
}

测试

public void VerifyGetSomethingInvokedWhenMethodUnderTestIsInvoked()
{
   //Arrange
   var sut = new SystemUnderTest();
  
   //Act
   string unusedResult = sut.MethodUnderTest(5);

   //Assert
   A.CallTo(()=> sut.MethodUnderTest(A<int>.Ignored))  //Cant figure out how to test the Func<T> invocation           
   
}

标签: c#unit-testingfakeiteasy

解决方案


一般来说,用假货进行测试的方法是

  1. 创建一个假对象来抽象出你的被测系统的合作者
  2. 可选地配置假货的行为
  3. 创建被测系统并提供假的
  4. 练习被测系统
  5. 选择性地审问假货

您缺少第 1 部分、第 3 部分(“提供”部分),并且第 5 部分略有偏离。我不知道x您的代码中代表什么,但是您需要伪造它的任何类型,并确保将伪造品提供给foo实例。然后你会有类似的东西

public void VerifyGetSomethingInvokedWhenMethodUnderTestIsInvoked()
{
   //Arrange
   var fakeX = A.Fake<IX>();
   var sut = new SystemUnderTest(fakeX); // maybe? which would pass it to `foo`?
  
   //Act
   string unusedResult = sut.MethodUnderTest(5);

   //Assert
   A.CallTo(() => fakeX.GetSomething(5)).MustHaveHappened();
}

推荐阅读