2011-07-12 46 views
0

我有一个测试创建服务的单元测试(使用typemock 5.4.5.0)。创建服务在其构造函数中传递到验证服务中。验证服务返回一个具有布尔属性(IsValid)的对象。在我的单元测试中,我嘲笑验证服务调用以返回IsValid设置为true的实例。创建服务有一个if语句来检查该属性的值。当我运行单元测试时,从验证服务返回的对象的属性设置为true,但是当执行if语句时,它将它视为假。被设置为true的模拟对象被当作假对待

我可以通过调试单元测试来验证这一点。验证服务返回的对象确实将其IsValid属性设置为true,但它完全跳过了我的if语句的主体并转到End If。

下面是单元测试本身的链接 - https://gist.github.com/1076372

这里是一个链接到创建服务功能我测试 - https://gist.github.com/1076376

有谁知道为什么地狱IsValid属性是真实的,但对待它是错误的?

P.S.我还在TypeMock的支持系统中输入了这个问题,但我想我可能会在这里得到更快的响应!

回答

0

首先,如果可能,我建议升级到您获得授权的最新版本的Typemock Isolator。每个出版的版本,甚至是次要版本,都包含修复有趣的边缘案例,有时会使事情工作不同。我发现升级有时可以修复事情。

接下来,我看到你的单元测试这一行:

Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(new QuestionViewModel())).WillReturn(new Validation(true)); 

红旗对我来说是“新QuestionViewModel()”这就是“WhenCalled()”块中。拇指

两个很好的规则,我公司始终遵循:

  1. 不要放任何东西,你不想嘲笑WhenCalled()。
  2. 如果你不关心参数,请不要传递真实的参数。

在这种情况下,第一条规则让我觉得“我不希望QuestionViewModel的构造函数被嘲笑,所以我不应该把它放在那里。”

第二条规则让我考虑“ValidateNewQuestionForExistingPool”方法的参数是否真的不重要。在这种情况下,它不是,所以我会传递null而不是真正的对象。如果您正在专门查看超负荷,请首先投射null。

最后,根据第一条规则,我通常不尝试内联我的返回值。这意味着我会在Isolate调用之前创建新的Validation对象。

var validation = new Validator(true); 
Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(null)).WillReturn(validation); 

试试看,它是如何运行的。您也可以在Typemock Tracer实用程序中查看当您运行测试以确保未设置额外的期望值时您设置的期望值。期待

相关问题