用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)); }
鉴于被测方法是异步的,您可能希望将测试设置为异步。