如何解决如何获得模拟类内部调用的方法的结果
例如,如果我具有以下类和接口:
DoSomethingClass.cs
public class DoSomethingClass
{
IInternalClass _intClass;
public DoSomethingClass(IInternalClass intClass)
{
_intClass = intClass;
}
void DoSomething(int number)
{
// do some transformation to the number,e.g.
var transformednumber = number * (number - 1);
var x = _intClass.IsEven(transformednumber);
// do something else
}
}
InternalClass.cs
public interface IInternalClass
{
bool IsEven(int number);
}
public class InternalClass: IInternalClass
{
public InternalClass();
public bool IsEven(int number)
{
return number % 2 == 0;
}
}
和一个测试班:
Tests.cs
public class Tests
{
[Fact]
public async Task test_something()
{
//PREPARE
var request = 10
var internalMock = new Mock<IInternalClass>();
var classtoTest = new DoSomethingClass(internalMock.Object);
// ACT
await classtoTest.DoSomething(request);
//ASSERT
//Here I want to check if the method IsEven of the internal class return the right result
}
}
}
我要声明的是在主方法IsEven
中调用的InternalClass
的方法DoSomething
的返回值,我无法知道{{1 }}在此方法内计算并传递给transformednumber
。
注意:我使用
IsEven
库来模拟对象。
对不起上面的愚蠢示例,但我这里没有任何简单的真实代码显示,但是我希望这足以理解这个问题。
解决方法
我假设您要验证在模拟的IInternalClass上是否已调用IsEven方法?
如果是这种情况,则可以按以下方式在模拟中使用Verify方法:
[Fact]
public void DoSomething_Verify()
{
var request = 10;
var internalMock = new Mock<IInternalClass>();
var classToTest = new DoSomethingClass(internalMock.Object);
classToTest.DoSomething(request);
//Verify that the mock is invoked with the expected value,the expected number of times
internalMock.Verify(v => v.IsEven(90),Times.Once);
//There are lots of other options for Times,e.g. it is never called with an unexpected value maybe.
internalMock.Verify(v => v.IsEven(91),Times.Never);
}
还要在等待时调用DoSomething方法,您将需要如下更改方法签名:
public async Task DoSomethingAsync(int number)
{
// do some transformation to the number,e.g.
var transformedNumber = number * (number - 1);
var x = _intClass.IsEven(transformedNumber);
// do something else
}
然后您可以创建一个像这样的单元测试:
[Fact]
public async void DoSomething_VerifyAsync()
{
var request = 10;
var internalMock = new Mock<IInternalClass>();
var classToTest = new DoSomethingClass(internalMock.Object);
//To call the DoSomething method with await the method needs the async Task and a good convention is to append Async to the name
await classToTest.DoSomethingAsync(request);
//Another slightly more generic option is to verify that the mock was called with and int exactly n Times
internalMock.Verify(v => v.IsEven(It.IsAny<int>()),Times.Exactly(1));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。