Unit testing mspec&;rhino模拟预期的异常测试

Unit testing mspec&;rhino模拟预期的异常测试,unit-testing,tdd,rhino-mocks,mspec,Unit Testing,Tdd,Rhino Mocks,Mspec,我对单元测试相当陌生,无法回避如何正确地测试(或者我是否应该)这个案例 我有一个控制器方法(伪代码): 我对“\u userService”进行了一系列单独的测试。“CreateUser”方法只是创建一个新用户,如果出现错误(例如用户存在),则不返回任何内容或引发异常,我会在try catch中向控制器周围冒泡,并将异常添加到ModelState 据我所知,我应该模拟服务并断言它被正确调用(我使用AssertWasCall语法),因为它不返回任何内容,我只想知道我的控制器调用了它 我不确定的是如

我对单元测试相当陌生,无法回避如何正确地测试(或者我是否应该)这个案例

我有一个控制器方法(伪代码):

我对“\u userService”进行了一系列单独的测试。“CreateUser”方法只是创建一个新用户,如果出现错误(例如用户存在),则不返回任何内容或引发异常,我会在try catch中向控制器周围冒泡,并将异常添加到ModelState

据我所知,我应该模拟服务并断言它被正确调用(我使用AssertWasCall语法),因为它不返回任何内容,我只想知道我的控制器调用了它

我不确定的是如何测试当userservice抛出错误时,它不应该重定向,应该将该异常添加到modelstate。使用rhino mock,您可以将一个mock存根,但《单元测试艺术》一书对此提出了建议


现在在我的测试中,我手动添加了一个模型错误(不管它是否来自用户服务),并测试控制器是否在出现错误时返回相同的视图。这是正确的方法吗?或者我应该创建一个单独的测试,在其中存根_userService以抛出一个错误并检查它是否被添加到modelstate?或者我甚至不应该测试这个案例?我觉得我可能只是过度分析了整件事,而使用modelstate进行测试就足以满足这一点……

您的模拟代表了一个协作类。我不会太在意模仿和存根之间的区别;这仍然是一个合作课程

您可以将单元测试视为描述如何使用类,以及该类如何与其协作者交互。你有两个例子:

Given a controller
When I register the model
Then the class should ask the user service to create a user.
以及:

这是第二个
给定的
,它告诉你你在存根而不是嘲笑。您正在设置用户服务,好像它已损坏。类所处的上下文是不同的,因此需要存根,并且确实应该抛出异常

如果您将这些行作为注释放在测试中,这将是有意义的。如果有道理的话,就忽略这本书


顺便说一句,这是单位级BDD。您可以在单元级别和场景级别使用“gived,When,Then”,这可能有助于您思考测试的逻辑。只是不要为此使用BDD场景工具。

您的模拟代表一个协作类。我不会太在意模仿和存根之间的区别;这仍然是一个合作课程

您可以将单元测试视为描述如何使用类,以及该类如何与其协作者交互。你有两个例子:

Given a controller
When I register the model
Then the class should ask the user service to create a user.
以及:

这是第二个
给定的
,它告诉你你在存根而不是嘲笑。您正在设置用户服务,好像它已损坏。类所处的上下文是不同的,因此需要存根,并且确实应该抛出异常

如果您将这些行作为注释放在测试中,这将是有意义的。如果有道理的话,就忽略这本书

顺便说一句,这是单位级BDD。您可以在单元级别和场景级别使用“gived,When,Then”,这可能有助于您思考测试的逻辑。只是不要为此使用BDD场景工具

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.