如果使用NSubstitute出现问题,则模拟一个抛出异常的方法

时间:2018-08-13 10:11:38

标签: c# unit-testing .net-core nsubstitute

我已经在.NET Core应用程序中实现了一项服务,调用该服务来验证我的模型。不幸的是,服务(不是我的)如果无效则抛出异常,如果有效则简单地以200 OK响应(因为它是void方法)。

所以基本上我要做这样的事情:

try {
    await _service.ValidateAsync(model);
    return true;
} catch(Exception e) {
    return false;
}

我正在尝试模拟ValidateAsync内部的方法,该方法将请求发送到我实现的服务。 ValidateAsync仅将控制器的输入从前端的某些内容转换为Validate方法可以理解的内容。

但是,我无法真正看到应如何测试。这是我尝试过的方法,但对我来说真的没有任何意义。

[TestMethod]
public void InvalidTest() {
    var model = new Model(); // obviously filled out with what my method accepts

    _theService.Validate(model)
        .When(x => { }) //when anything
        .Do(throw new Exception("didn't work")); //throw an exception

    //Assert should go here.. but what should it validate?
}

所以基本上:When this is called -> throw an exception

我应该如何使用NSubstitute来模拟它?

1 个答案:

答案 0 :(得分:4)

根据当前的解释,假设类似于

public class mySubjectClass {

    private ISomeService service;

    public mySubjectClass(ISomeService service) {
        this.service = service;
    }

    public async Task<bool> SomeMethod(Model model) {
        try {
            await service.ValidateAsync(model);
            return true;
        } catch(Exception e) {
            return false;
        }
    }

}

为了覆盖SomeMethod的错误路径,依赖项在调用时需要引发异常,以便可以按预期执行测试。

[TestMethod]
public async Task SomeMethod_Should_Return_False_For_Invalid_Model() {
    //Arrange
    var model = new Model() { 
        // obviously filled out with what my method accepts
    };

    var theService = Substitute.For<ISomeService>();
    theService
        .When(_ => _.ValidateAsync(Arg.Any<Model>()))
        .Throw(new Exception("didn't work"));

    var subject = new mySubjectClass(theService);

    var expected = false;

    //Act
    var actual = await subject.SomeMethod(model);

    //Assert
    Assert.AreEqual(expected, actual);
}