Razor 希望在ASP.NET Core 2.1中为ViewComponent创建单元测试
在ASP.NET Core 2.1中,ViewComponents相对于部分页面的一个显著优势是它们非常容易测试。我在文档中找不到任何关于如何实际测试的示例 我的ViewComponent在其构造函数中采用IConfiguration,因此我可以注入AppSetting值。它是通过调用传入的两个参数执行的。我假设我想以某种方式测试返回到视图的模型,并确保它符合我的预期(基于AppSettings和这两个参数) [编辑] 下面是一个简单的ViewComponent示例,它使用配置服务并将一个参数传递到invoke中Razor 希望在ASP.NET Core 2.1中为ViewComponent创建单元测试,razor,asp.net-core,asp.net-core-viewcomponent,Razor,Asp.net Core,Asp.net Core Viewcomponent,在ASP.NET Core 2.1中,ViewComponents相对于部分页面的一个显著优势是它们非常容易测试。我在文档中找不到任何关于如何实际测试的示例 我的ViewComponent在其构造函数中采用IConfiguration,因此我可以注入AppSetting值。它是通过调用传入的两个参数执行的。我假设我想以某种方式测试返回到视图的模型,并确保它符合我的预期(基于AppSettings和这两个参数) [编辑] 下面是一个简单的ViewComponent示例,它使用配置服务并将一个参数传
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
namespace WebApp.Pages.Components.RatingControl
{
public class MyModel
{
public string MyVal1 { get; set; }
public string MyVal2 { get; set; }
}
public class MyViewData
{
public MyModel MyModel { get; set; }
public string Param1 { get; set; }
}
public class SimpleViewComponent : ViewComponent
{
private readonly MyModel _myModel;
public SimpleViewComponent(IConfiguration config)
{
_myModel = new MyModel
{
MyVal1 = config["myVal1"],
MyVal2 = config["myVal2"],
};
}
public IViewComponentResult Invoke(string param1)
{
var myViewData = new MyViewData
{
MyModel = _myModel,
Param1 = param1
};
return View(myViewData);
}
}
}
也许这很明显,但我在这里有点迷茫。不应该将
IConfiguration
作为依赖项传递。您已经有了一个填充的模型,因此可以利用配置框架的绑定功能,并在启动时从配置显式地注入填充的模型
假设您的appsetting.json文件
对于现有的MyModel
,您可以按照文档中建议的做法,从配置启动时绑定对象图
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
var myModel = new MyModel();
Configuration.Bind(myModel);
然后,您将向服务集合注册模型应用程序设置
services.AddSingleton(myModel);
因为视图组件是由框架使用依赖项注入进行初始化的
现在确实不需要将IConfiguration
注入视图组件,因为模型可以作为显式依赖项注入
public class SimpleViewComponent : ViewComponent {
private readonly MyModel model;
public SimpleViewComponent(MyModel model) {
this.model = model;
}
public IViewComponentResult Invoke(string param1) {
var myViewData = new MyViewData {
MyModel = model,
Param1 = param1
};
return View(myViewData);
}
}
所有这些都将使独立地对视图组件进行单元测试变得相当容易,因为初始化模型的假实例很简单
//Arrange
var model = new MyModel {
MyVal1 = "test1",
MyVal2 = "test2",
}
var viewComponent = new SimpleViewComponent(model);
var param1 = "param1";
//Act
var result = viewComponent.Invoke(param1);
//Assert
result.Should().NotBeNull();
result.ViewData.Model
.Should().NotBeNull()
.And.BeOfType<MyViewData>();
//...other assertions
//排列
var模型=新的MyModel{
MyVal1=“test1”,
MyVal2=“test2”,
}
var viewComponent=新的SimpleViewComponent(模型);
var param1=“param1”;
//表演
var result=viewComponent.Invoke(param1);
//断言
result.Should().NotBeNull();
result.ViewData.Model
.Should().NotBeNull()
.和.BeOfType();
//…其他断言
提供您想要测试的组件的示例,以及您到目前为止如何在sour repo测试中对其进行测试,您可以使用sour repo测试作为示例,但它们将针对组件的特定功能。您好@Nkosi,谢谢您的示例,但我看不到将配置(IConfiguration)传递到viewcomponent的方法,这是所示列表中测试的一部分。在Core 2.1中,它们已更改为使用CreateWebHostBuilder,因此您的示例不再有效。另外,您是否建议永远不要使用构造注入?我的小例子,并没有涵盖我所有的案例。IConfiguration只是一个例子。我不喜欢为我想测试的所有东西放松构造注入。@Pete你把集成测试和单元测试搞混了。此外,我从未建议不要使用构造函数注入。我建议不要注入IConfiguration
,而是使用显式依赖原则。谢谢@Nkosi。您将如何使用构造注入进行测试?具体的配置是什么?我不认为这是集成测试,因为构造函数中的值会改变组件的行为。@Pete我已经在回答中说明了如何测试它。模型正在注入组件的构造函数中。不需要将组件分别耦合到i配置
,不需要。我正在寻找有关如何对具有IConfiguration或任何其他服务注入构造函数的视图组件进行单元测试的帮助。不是作为构造函数参数传入的简单模型。我不是在征求意见,看这是不是一个好主意。在微软策划的博客上有一个确切的例子,但没有测试(这就是我要找的)。
//Arrange
var model = new MyModel {
MyVal1 = "test1",
MyVal2 = "test2",
}
var viewComponent = new SimpleViewComponent(model);
var param1 = "param1";
//Act
var result = viewComponent.Invoke(param1);
//Assert
result.Should().NotBeNull();
result.ViewData.Model
.Should().NotBeNull()
.And.BeOfType<MyViewData>();
//...other assertions