c# - 使用 Mock 进行 Nunit 测试。接口(interface)实例

标签 c# mocking nunit moq simple-injector

我有以下(简化的)代码。

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);
         }
     }
}

而SimpleInjector用来注入(inject)_service和它的实现类之间的依赖,像这样:

public static void Register(Container container)
{
    container.Register<IService, Service>();
}

请注意,注入(inject)和单元测试对我来说是新手,所以我不完全理解它们,但正在学习。

如果我通过 Swagger 运行应用程序,一切正常。

请注意,当我通过 Swagger 运行应用程序时,会调用 Register 函数。

现在,我正在尝试使用 NUnit 设置一些单元测试,并像这样模拟 IService 对象:

var Service = new Mock<IService>();
Controller _controller = new Controller(Service.Object);
_controller.Create(new MyObject object());

到目前为止,这对我来说似乎是正确的 - 虽然我不确定?

问题是对于单元测试,result 始终为 null - 我认为这是因为我的接口(interface) Mock 有问题 - 它似乎没有找到方法 -它永远不会进入它,也不会出现在调试器中。

请注意,对于单元测试,不会调用 Register 方法。我确实尝试调用它来注册依赖项,但它没有帮助。

正如我上面所说,这对我来说是全新的,我对所有这些都处于理解的边缘。

我没有想法,不知道从这里看哪里,所以任何帮助将不胜感激。

编辑:

原来的问题是这样的:

public async Task<IHttpActionResult> Create(string content)

我已经更新到:

public async Task<IHttpActionResult> Create(MyObject object)

谁能建议我如何在设置中传递对 MyObject 的通用引用,而不必创建此类的实例。

所以基本上我想告诉它该类的一个实例将被传入,而不创建该实例。

我尝试了以下方法:

Service.Setup(x => x.method(It.IsAny<MyObject>())

but it says cannot convert MethodGroup to MyObject

这里是 IService 的定义:

public interface IService
{
      IdentityResult method(ApplicationUser user, UserLoginInfo login);
}

最佳答案

您需要配置 Mock 对象为 IService.method 返回一些内容,如下所示:

var Service = new Mock<IService>();
Service.Setup(x => x.method(It.IsAny<string>())
    .Returns<string>(str => **whatever result you need**);

通过添加实际的 IService 定义,您应该将 Setup 调用更改为:

Service.Setup(x => x.method(It.IsAny<ApplicationUser>(), It.IsAny<UserLoginInfo>())
    .Returns<ApplicationUser, UserLoginInfo>((user, login) => new IdentityResult(true));

关于c# - 使用 Mock 进行 Nunit 测试。接口(interface)实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611795/

相关文章:

用于单元测试的 XML 数据

c# - 如何忽略 SSL 证书是由未知证书颁发机构签署的问题?

c# - EF 代码优先 - IsConcurrencyToken()

delphi - 为 Mock 提供数据以进行单元测试

asp.net-mvc - 如何在 ASP.Net MVC 中模拟 Controller 上的请求?

c# - 如何使用 Moq 在没有 setter 的情况下初始化复杂属性?

android - Android 单声道 : Which Testing Frameworks work

c# - 如何在 Linqpad 中启用 ASP.NET 角色管理器?

c# - MSDN FileSystemWatcher 类示例中的 PermissionSet 属性的用途是什么?

java - 我是否以正确的方式使用模拟?