断言 Fun<T> 被调用

Assert that Fun<T> was invoked

鉴于以下 class,我如何测试调用 MethodUnderTest 时调用 GetSomething

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           
   
}

一般来说,检测假货的方法是

  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();
}