mspec和rhino模拟预期的异常测试

| 我对单元测试还很陌生,无法解决如何测试(或者甚至不应该)这种情况。 我有一个控制器方法(伪代码):
public ActionResult Register(formModel model)
{

    if (ModelState.isValid) {

        try {

            _userService.CreateUser(a bunch of parameters here);
            return RedirectToAction(some other action);
        }
        catch (Exception e)
        {

            ModelState.AddModelError(\"\",e.Message);

        }

    }

    return View();
}
我对\ __ userService \有很多单独的测试。 \“ CreateUser \”方法仅创建一个新用户,不返回任何内容,或者如果发生错误(例如,该用户存在),我在尝试捕获中冒泡到控制器周围,并将异常添加到ModelState,则不引发异常。 据我了解,我应该模拟该服务并断言它已被正确调用(我使用assertwasCalled语法),因为它什么也不返回,我只想知道我的控制器在调用它。 我不确定如何测试当用户服务引发错误时,该错误不应重定向,而应将该异常添加到modelstate中。使用犀牛模拟,您可以对模拟进行存根,但是单元测试的书本建议不要这样做。 现在,在我的测试中,我手动添加了一个模型错误(不在乎是否来自用户服务),并在出现错误时测试控制器是否返回相同的视图。这是解决这个问题的正确方法吗?还是应该创建一个单独的测试,在其中对_userService存根以引发错误并检查是否将其添加到了模型状态?还是我什至不应该测试这种情况?我觉得我可能只是分析整个事情,而使用modelstate进行测试就足以满足此要求...     
已邀请:
您的模拟代表一个协作的班级。我不会太在意模拟和存根之间的区别。它仍然是一个合作的课堂。 您可以认为单元测试描述了如何使用您的类,以及该类随后如何与其协作者进行交互。您有两个示例:
Given a controller
When I register the model
Then the class should ask the user service to create a user.
和:
Given a controller
Given the user service is broken
When I register the model
Then the class should attach the error to the model state.
是第二个“ 3”秒告诉您,您是在轻描淡写,而不是在嘲笑。您正在将用户服务设置为已损坏。类所作用的上下文是不同的,因此您需要存根,并且确实应该抛出异常。 如果将这些行作为测试内部的注释,这将很有意义。如果有道理,请忽略这本书。 BTW,这是单位级别的BDD。您可以像在场景级别上一样在单元级别上使用“给出,何时,然后”,这可能有助于您考虑测试的逻辑。只是不要为此使用BDD方案工具。     

要回复问题请先登录注册