【发布时间】:2014-11-20 12:31:57
【问题描述】:
我正在对实例方法进行单元测试。该方法恰好是一个 ASP.NET MVC 4 控制器操作,但我认为这并不重要。我们刚刚在这个方法中发现了一个错误,我想使用 TDD 来修复这个错误并确保它不会再次出现。
被测方法调用返回对象的服务。然后它调用一个传递该对象的字符串属性的内部方法。错误是在某些情况下,服务返回 null,导致被测方法抛出 NullReferenceException。
控制器使用依赖注入,所以我可以模拟服务客户端让它返回一个空对象。问题是我想更改被测方法,以便当服务返回 null 时,应该使用默认字符串值调用内部方法。
我能想到的唯一方法是对被测类使用模拟。我希望能够断言或验证是否已使用正确的默认值调用了此内部方法。当我尝试这个时,我得到一个 MockException 说明调用不是在模拟上执行的。然而,我能够调试代码并查看正在调用的内部方法,并使用正确的参数。
证明被测方法调用另一个传递特定参数值的方法的正确方法是什么?
【问题讨论】:
-
内部方法的调用没有可观察到的行为吗?你到底想验证什么?该方法是使用预期的默认值调用的,还是只是在服务返回 null 时它不会崩溃?第一个对我来说似乎很脆弱,因为如果有人更改默认值,它将失败。如果这很重要,那么就足够公平了,但是您是否真的关心默认值是否已更改,或者只是在服务返回 null 时该方法不会失败?
-
你能展示一些伪代码吗?这听起来像一个常见的模拟场景,但如果没有一些代码,我不能肯定地说。
-
@SamHolder:内部方法根据此参数的值返回一个包含一到三个值的集合。不幸的是,它不是一对一的,所以我无法使用返回值来确定传递了哪个参数。我将在几个小时内用伪代码扩展这个问题。
标签: unit-testing visual-studio-2013 moq