设置为true的模拟对象正在被视为错误

时间:2011-07-12 17:19:23

标签: unit-testing boolean typemock

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

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

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

以下是我正在测试的创作服务功能的链接 - https://gist.github.com/1076376

有谁知道为什么IsValid属性为真,但被视为假的?

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

1 个答案:

答案 0 :(得分:0)

首先,如果可能的话,我建议您升级到您获得许可的最新版本的Typemock Isolator。每个出版的版本,即使是次要版本,都包含针对有趣的边缘情况的修复,有时会使工作方式不同。我发现升级有时可以解决问题。

接下来,我在单元测试中看到这一行:

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

我的红旗是“新的QuestionViewModel()”,它位于“WhenCalled()”区块内。

我总是遵循两条好的经验法则:

  1. 不要在WhenCalled()中添加任何你不想嘲笑的东西。
  2. 如果您不关心参数,请不要传递真实的参数。
  3. 在这种情况下,第一条规则让我觉得“我不想让QuestionViewModel的构造函数被模拟,所以我不应该把它放在那里。”

    第二条规则让我考虑“ValidateNewQuestionForExistingPool”方法的参数是否真的不重要。在这种情况下,它不是,所以我传递null而不是真正的对象。如果你有特别关注的过载,请首先抛出空值。

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

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

    试试看,看看它是如何运行的。您可能还会在Typemock Tracer实用程序中观察,以便在运行测试时看到正在设置的期望值,以确保没有设置其他期望,而不是期待