【发布时间】:2018-06-22 20:56:16
【问题描述】:
在 .NET Core 中,我们有一个控制器操作调用具有依赖注入的 ViewComponent,遵循 Microsoft 文档 here 中的模式。
如果我们有一个控制器动作,它会返回这样的渲染视图:
public class MyController : Controller
{
private readonly IToDoContext _todoContext;
public MyController(IToDoContext todoContext)
{
_todoContext = todoContext;
}
public IActionResult IndexVC()
{
return ViewComponent("PriorityList", new { maxPriority = 3, isDone = false });
}
}
还有一个具有如下依赖注入的 ViewComponent:
public class PriorityListViewComponent : ViewComponent
{
private readonly ToDoContext db;
public PriorityListViewComponent(ToDoContext context)
{
db = context;
}
public async Task<IViewComponentResult> InvokeAsync(int maxPriority, bool isDone)
{
var items = await GetItemsAsync(maxPriority, isDone);
return View(items);
}
private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
{
return db.ToDo.Where(x => x.IsDone == isDone && x.Priority <= maxPriority).ToListAsync();
}
}
我们如何在控制器动作单元测试中将 ToDoContext 注入到 ViewComponent 中?到目前为止,result.Model 始终为空,因为似乎没有办法将 ToDoContext db 注入到 Controller 中,然后再注入到 ViewComponent 中。
[Fact]
public void Should_return_viewcomponent()
{
var mockToDoContext = new Mock<IToDoContext>();
mockToDoContext.Setup(m => m.Get()).ReturnsAsync(new ToDoContext());
var sut = new MyController(mockToDoContext.Object);
var result = sut.PriorityListViewComponent("myparams") as ViewComponentResult;
// ToDoContext db is never set, so the result.Model is always null
}
【问题讨论】:
标签: c# asp.net-core asp.net-core-2.0