c#, nUnit 如何验证是否调用了另一个 class 的方法

c#, nUnit How to verify if the method from another class is been called

我正在进行 .NET CORE 3.1 nUnit 测试。我在其构造函数中注入了 class ClassXServicesClassX 接口。在 ClassX 中,有一个从 ServiceClassX 调用 public 方法的私有方法。我想知道,我如何验证来自 ServiceClassX 的这个方法已被调用??

我需要测试 ServiceClassX.ProcessAzureMessage(message) 方法是否被调用/验证。

ClassX

public class ClassX
{
    private readonly IServiceClassX ServiceClassX;
 
 public ClassX(IServiceClassX services){
    ServiceClassX = services;
 }

 public Customer Run(){
    var cus = MethodX();
    return cus;
 }

  private Customer MethodX(){
     bool valueExit = true;
     string message = "myRecord";
   
    if(valueExit){
       ServiceClassX.ProcessAzureMessage(message);
    }
  }

nUnit

[TestFixture]
public class ClassXTests
{
  private readonly ClassX _sut;
  private readonly Mock<IServiceClassX> _serviceClassXMoq;

  public ClassXTests(){
     this._sut = new ClassX(_serviceClassXMoq.Object)
  }

    [Test]
    public void Test1()
    {
      
       var customer = _sut.();

       _serviceClassXMoq.Verify(?????????

    }

由于您没有指定您正在使用或必须使用最小起订量,我将建议一个稍微不同的路线。就个人而言,我更喜欢 FakeItEasy 而不是 Moq,因为我觉得它使这种类型的测试变得更加容易,并且在您阅读它时它的实现方式更有意义。

这是一个示例,说明如何使用您提供的代码完成此操作。

using FakeItEasy;

public class ClassXTests
{
    private IServiceClassX _serviceClass;
    private ClassX _sut;

    public ClassXTests()
    {
        _serviceClass = A.Fake<IServiceClassX>();
        this._sut = new ClassX(_serviceClass)
    }

    [Test]
    public void Test1()
    {
  
       var customer = _sut.(); //Call your _sut method

       //Verify the Verify method was called with any parameter of type MyType
       A.CallTo(() => _serviceClass.Verify(A<MyType>._)).MustHaveHappened();
    }
}

A<MyType>._A<MyType>.Ignored 的 shorthand。当断言对方法的调用发生时,您可以选择为参数传递一个特定的预期值,或者您可以执行 .Ignored ,这将告诉它不要关心传入的参数值,只关心方法是用 something.

调用

如果你有

public class Foo
{
    public bool Verify(Bar bar);
}

public class Bar
{
    public string Name { get; set; }
}

您的测试可能是使用名称“K.Z”调用了 Verify,因此您可以这样做。

A.CallTo(() => _serviceClass.Verify(A<Bar>.That.Matches((x => x.Name.StartsWith("K")).MustHaveHappened();

他们也有一些固定的匹配功能,但仅此而已well-documented。