用Mock测试Nunit。 接口实例

我有以下(简化)代码。

public class Controller { private readonly IService _service; public Controller(IService service) { _service = service; } public async Task Create(MyObject object) { var result = _service.method(object); if (!result.Succeeded) { return this.GetErrorResult(object); } } } 

和SimpleInjector用于注入_service和它的实现类之间的依赖关系,如下所示:

 public static void Register(Container container) { container.Register(); } 

作为一个注释,注射和unit testing对我来说是新的,所以我不完全理解它们,但我正在学习。

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

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

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

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

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

问题是对于unit testing, result总是为空 – 我认为这是因为我的Mock接口存在问题 – 它似乎没有找到方法 – 它从不进入它并且不会出现int他调试器。

需要注意的是,对于unit testing,不会调用Register方法。 我确实试着调用它来注册依赖项,但它没有帮助。

正如我上面所说的,这对我来说是全新的,我对所有这一切都有了解。

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

编辑:

最初的问题如下:

 public async Task Create(string content) 

我已更新为:

 public async Task Create(MyObject object) 

任何人都可以建议我如何在设置中传递对MyObject的generics引用,而不必创建此类的实例。

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

我尝试过以下方法:

 Service.Setup(x => x.method(It.IsAny()) 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(); Service.Setup(x => x.method(It.IsAny()) .Returns(str => **whatever result you need**); 

添加实际的IService定义后,应将Setup调用更改为:

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

必须在Mock对象上调用setup方法。

 var Service = new Mock(); Service.Setup(x=>x.method("argument")).Returns(YourReturnObject) Controller _controller = new Controller(Service.Object); 

使用您的简化示例

 public class Controller { private readonly IService _service; public Controller(IService service) { _service = service; } public async Task Create(string content) { var result = await _service.method(content); if (!result.Succeeded) { return this.GetErrorResult(result); } return Ok(); } } 

让我们假设IService被定义为

 public interface IService { Task method(string input); } public class Result { public bool Succeeded { get; set; } } 

对于unit testing,您需要设置模拟以伪造测试所需的操作

 public async Task Controller_Given_Content_Should_Return_Ok() { //Arrange var input = "content"; var mockService = new Mock(); mockService .Setup(m => m.method(input)) .ReturnAsync(new Result { Succeeded = true }); var _controller = new Controller(mockService.Object); //Act var result = await _controller.Create(input); //Assert Assert.IsNotNull(result); Assert.IsInstanceOfType(result,typeof(OkResult)); } 

鉴于被测方法是异步的,您可能希望将测试设置为异步。