我无法对返回匿名对象的ASP.NET Core MVC控制器进行单元测试.单元测试在单独的项目中设置,并直接从主项目调用控制器方法.
控制器方法返回IActionResult但通常这些OkObjectResult和BadRequestObjectResult对象被转换为具有适当HTTP状态代码的JSON响应.匿名对象作为对象的构造函数参数传递,ObjectResult正是这些我试图对(可访问的ObjectResult.Value)进行断言.
我发现这个问题(我如何访问asp.net 5中的内部)有一个答案,说使用动态和添加
[assembly: InternalsVisibleTo("Namespace")]
Run Code Online (Sandbox Code Playgroud)
到AssemblyInfo.cs允许测试项目访问匿名对象的内部对象属性.但是,最新版本的ASP.NET Core MVC没有AssemblyInfo.cs,并且在链接问题的答案中建议添加一个也不起作用.
是否现在有一个不同的位置来添加InternalsVisibleTo或我错过了什么?
我有以下(简化的)代码。
public class Controller
{
private readonly IService _service;
public Controller(IService service)
{
_service = service;
}
public async Task<IHttpActionResult> Create(MyObject object)
{
var result = _service.method(object);
if (!result.Succeeded)
{
return this.GetErrorResult(object);
}
}
}
Run Code Online (Sandbox Code Playgroud)
而 SimpleInjector 用于注入 _service 与其实现类之间的依赖关系,如下所示:
public static void Register(Container container)
{
container.Register<IService, Service>();
}
Run Code Online (Sandbox Code Playgroud)
请注意,注入和单元测试对我来说是新的,所以我不完全理解它们,但正在学习。
如果我通过 Swagger 运行应用程序,一切正常。
请注意,Register当我通过 Swagger 运行应用程序时会调用该函数。
现在,我正在尝试使用 NUnit 设置一些单元测试,并像这样模拟 IService 对象:
var Service = new Mock<IService>();
Controller _controller = new Controller(Service.Object);
_controller.Create(new MyObject object());
Run Code Online (Sandbox Code Playgroud)
到目前为止,这对我来说似乎是正确的 - 尽管我不确定?
问题是对于单元测试, …