Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Razor 希望在ASP.NET Core 2.1中为ViewComponent创建单元测试_Razor_Asp.net Core_Asp.net Core Viewcomponent - Fatal编程技术网

Razor 希望在ASP.NET Core 2.1中为ViewComponent创建单元测试

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示例,它使用配置服务并将一个参数传

在ASP.NET Core 2.1中,ViewComponents相对于部分页面的一个显著优势是它们非常容易测试。我在文档中找不到任何关于如何实际测试的示例

我的ViewComponent在其构造函数中采用IConfiguration,因此我可以注入AppSetting值。它是通过调用传入的两个参数执行的。我假设我想以某种方式测试返回到视图的模型,并确保它符合我的预期(基于AppSettings和这两个参数)

[编辑] 下面是一个简单的ViewComponent示例,它使用配置服务并将一个参数传递到invoke中

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