c# - Frozen Mock 返回 null 但在 Test 方法中工作正常
问题描述
我正在尝试测试一项服务,该服务利用提供者从数据库中获取一些值并在返回一些值之前在服务中使用它。调试测试时,模拟的提供者工作正常。但是当完整运行测试时,提供者总是返回 null。
测试用例
[Theory]
[AutoStackoverFlowData]
public async Task TestingService(Service sut, [Frozen] Mock<IProvider> providerMock)
{
providerMock.Setup(x => x.GetGreeting(It.IsAny<int>())).ReturnsAsync("Hello Developer");
var s = providerMock.Object.GetGreeting(123); //works returns "Hello Developer"
var greeting = sut.SayHello();
Assert.Equal(greeting, "Hello Developer");
}
public class AutoStackoverFlowData : AutoDataAttribute
{
public AutoStackoverFlowData() : this(new AutoMoqCustomization()) { }
public AutoStackoverFlowData(params ICustomization[] customization)
: base(() => new Fixture().Customize(new AutoMoqCustomization())) { }
}
服务
public class Service
{
private readonly IProvider provider
public Service(IProvider provider)
{
this.provider= provider;
}
public async Task<string> SayHello()
{
int someNum= 123;
var temp = await subProvider.GetGreeting(someNum);
return temp;
}
}
界面
public interface IProvider
{
Task<string> GetGreeting(int id);
}
解决方案
使用[冰冻]时,顺序很重要。始终将 [Frozen] 变量作为测试用例中的第一个参数。这是一个简单的修复:
[Theory]
[AutoStackoverFlowData]
public async Task TestingService([Frozen] Mock<IProvider> providerMock, Service sut)
{
providerMock.Setup(x => x.GetGreeting(It.IsAny<int>())).ReturnsAsync("Hello Developer");
var s = providerMock.Object.GetGreeting(123);
var greeting = await sut.SayHello();
Assert.Equal("Hello Developer", greeting);
}
推荐阅读
- caching - smarty tpl 文件被缓存,更新也不可能
- c# - 我在这个方法c#中返回什么
- c++ - 字符数组初始化和尾随 null
- postgresql - PostgreSQL 没有在 UPDATE 语句上使用正确的分区
- javascript - 有没有一个函数可以改变 JS 中的参数给定的全局变量?
- sass - 如何使用mixin从scss中未定义长度的数组创建字符串?
- php - ReactJS 生产构建不包括文件
- batch-file - 如何根据不同文件中的文本重命名文件行?
- javascript - 存储json还是js对象效率更高
- scala - Intellij Idea - 如何在 INSIDE IDE 中获得并行 scalatest 执行