c#, nUnit 如何验证是否调用了另一个 class 的方法
c#, nUnit How to verify if the method from another class is been called
我正在进行 .NET CORE 3.1 nUnit 测试。我在其构造函数中注入了 class ClassX
和 ServicesClassX
接口。在 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。
我正在进行 .NET CORE 3.1 nUnit 测试。我在其构造函数中注入了 class ClassX
和 ServicesClassX
接口。在 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。