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

gro*_*kky 5 c# nunit asp.net-core-mvc asp.net-core

我需要将视图渲染为字符串(以电子邮件形式发送)。我正在使用这个实现

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

默认实现是RazorViewEngine. 我有一个大型构造函数,因为每个参数都需要创建,并且每个参数都有一个大型构造函数,等等(我无法模拟它,我需要一个实时实例。)

当然有更简单的方法来获取实例吗?

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

bka*_*aid 5

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

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>();
Run Code Online (Sandbox Code Playgroud)

我最终采用了更多使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试视图.cshtml:

@model string
<h1>@Model</h1>
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1329 次

最近记录:

7 年,1 月 前