c# - xUnit 的模拟服务
问题描述
我有一个当前按设计工作的应用程序,但我正在尝试使用 xUnit 设置集成测试,然后再对其进行扩展。目前测试在执行测试时只会使用原始服务,我不明白为什么。
这是测试:
using IStoreRepository = Repositories.V3.Interfaces.IStoreRepository;
public class StoreTests : IClassFixture<WebApplicationFactory<Startup>> {
private readonly ITestOutputHelper _output;
private readonly WebApplicationFactory<Startup> _factory;
private readonly string _url;
public StoreTests(ITestOutputHelper output, WebApplicationFactory<Startup> factory) {
_output = output;
_factory = factory;
_url = "/api/store";
}
[Theory]
[InlineData("GET", "FAKE123")]
public async Task StoreByCode(string method, string code = null) {
// var client = _factory.CreateClient();
var client = _factory.WithWebHostBuilder(builder => {
builder.ConfigureTestServices(services => {
services.AddScoped<IStoreRepository, StoreRepositoryTest>();
});
}).CreateClient();
var request = new HttpRequestMessage(new HttpMethod(method), $"{_url}/{code}");
string readAsStringAsync;
_output.WriteLine($"Request Uri: {request.RequestUri}");
using (var response = await client.SendAsync(request)) {
response.EnsureSuccessStatusCode();
readAsStringAsync = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode) {
_output.WriteLine($"Not successful ({response.StatusCode}): {readAsStringAsync}");
}
}
var stores = JsonConvert.DeserializeObject<List<Store>>(readAsStringAsync);
Assert.True(stores.Any());
}
}
但是,当我进行测试时Repository
,StoreRepository
在 Startup.cs 中注册的实际断点是被击中的断点,而不是StoreRepositoryTest
. 我设置我的工厂来覆盖依赖,但它忽略了它。我能做些什么来纠正这个问题。
作为参考,我一直在使用这个来源:https ://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2
更新
不确定这个问题是否应该被删除,但它最终成为一个非常愚蠢的错误。我更新了上面的代码以包含一个 using 别名。原来我是在注册和覆盖 V1 接口而不是 V3。当我实现 Mock 类时,我没有意识到我正在实现旧服务。所以好消息是上面的代码是一个如何使用微软文档进行模拟的工作示例。
解决方案
我以前见过这个。您可能在不同的命名空间中创建了一个接口。
通常,当您拥有用于 Web 服务的版本 1 接口,然后您决定添加新功能时,就会发生这种情况。然后,您创建一个名称完全相同的版本 2 接口。
设置一个断点services.AddScoped<IStoreRepository, StoreRepositoryTest>()
并进行调试。检查结果并滚动到添加服务的底部;您将清楚地了解正在添加的内容。
推荐阅读
- git - “https://”:无法解析主机:信息——Git Hub 新安全
- python - 如何知道每个用户评分的电影有多少个 0.5/1/1.5/2/2.5/3/3.5/4/4.5/5 评分?
- plotly - 如何将python plotly转换为javascript plotly graph
- r - 比 plot 更基本的 R 命令
- php - 在表单框架 7 PHP 中使用文本编辑器
- python - 如何将 csv 数据添加到我的 Hashtable?Python
- arrays - 将两个列表与字符串数据进行比较?
- c++ - 如何为 gtkmm 应用程序创建 CMakeLists.txt?
- java - 无法通过 url 将图像下载到我在 android 10 中的手机中
- html - 无法创建网页布局设计