gpt4 book ai didi

c# - 依赖于 IRazorViewEngine 真实实例的单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:54 26 4
gpt4 key购买 nike

我需要将 View 呈现为字符串(以作为电子邮件发送)。我正在使用 this implementation .

我想对其进行单元测试,而不需要完整的 ASP.NET Core 环境。所以我必须创建一个 IRazorViewEngine 的实例。

默认实现是 RazorViewEngineI has a mega constructor因为每个参数都需要创建,并且每个参数都有一个大型构造函数等等(我不能模拟它,我需要一个实时实例。)

肯定有更简单的方法来获取实例吗?

(在 Core 之前,我可以使用 ViewEngines.Engines。也许 Core 有类似的东西?)

最佳答案

我也尝试通过与此类似的单元测试来做到这一点,但遇到了各种问题:

var services = new ServiceCollection();
services.AddMvc();
... ended up needing to add random things into the service collection ...
var serviceProvider = services.BuildServiceProvider();
var razorViewEngine = serviceProvider.GetRequiredService<IRazorViewEngine>();

我最终采用了更多的组件测试方法,使用 Microsoft.AspNetCore.Mvc.Testing :

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection;
using Xunit;

public class ComponentTestStartup : IStartup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
return services.BuildServiceProvider();
}

public void Configure(IApplicationBuilder app)
{
}
}

public class ComponentTestServerFixture : WebApplicationFactory<ComponentTestStartup>
{
public TService GetRequiredService<TService>()
{
if (Server == null)
{
CreateDefaultClient();
}

return Server.Host.Services.GetRequiredService<TService>();
}

protected override IWebHostBuilder CreateWebHostBuilder()
{
var hostBuilder = new WebHostBuilder();
return hostBuilder.UseStartup<ComponentTestStartup>();
}

// uncomment if your test project isn't in a child folder of the .sln file
// protected override void ConfigureWebHost(IWebHostBuilder builder)
// {
// builder.UseSolutionRelativeContentRoot("relative/path/to/test/project");
// }
}

public class RazorViewToStringRendererTests
{
private readonly RazorViewToStringRenderer viewRenderer;

public RazorViewToStringRendererTests()
{
var server = new ComponentTestServerFixture();
var serviceProvider = server.GetRequiredService<IServiceProvider>();
var viewEngine = server.GetRequiredService<IRazorViewEngine>();
var tempDataProvider = server.GetRequiredService<ITempDataProvider>();
viewRenderer = new RazorViewToStringRenderer(viewEngine, tempDataProvider, serviceProvider);
}

[Fact]
public async Task CanRenderViewToString()
{
// arrange
var model = "test model";

// act
var renderedView = await viewRenderer.RenderViewToStringAsync("/Path/To/TestView.cshtml", model);

// assert
Assert.NotNull(renderedView);
Assert.Contains(model, renderedView, StringComparison.OrdinalIgnoreCase);
}
}

测试 View .cshtml:

@model string
<h1>@Model</h1>

关于c# - 依赖于 IRazorViewEngine 真实实例的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43618008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com