我有一个测试创建服务的单元测试(使用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的支持系统中输入了这个问题,但我想我可能会在这里得到更快的回复!
答案 0 :(得分:0)
首先,如果可能的话,我建议您升级到您获得许可的最新版本的Typemock Isolator。每个出版的版本,即使是次要版本,都包含针对有趣的边缘情况的修复,有时会使工作方式不同。我发现升级有时可以解决问题。
接下来,我在单元测试中看到这一行:
Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(new QuestionViewModel())).WillReturn(new Validation(true));
我的红旗是“新的QuestionViewModel()”,它位于“WhenCalled()”区块内。
我总是遵循两条好的经验法则:
在这种情况下,第一条规则让我觉得“我不想让QuestionViewModel的构造函数被模拟,所以我不应该把它放在那里。”
第二条规则让我考虑“ValidateNewQuestionForExistingPool”方法的参数是否真的不重要。在这种情况下,它不是,所以我传递null而不是真正的对象。如果你有特别关注的过载,请首先抛出空值。
最后,基于第一条规则,我通常也会尝试不内联我的返回值。这意味着我将在隔离调用之前创建新的Validation对象。
var validation = new Validator(true);
Isolate.WhenCalled(() => validator.ValidateNewQuestionForExistingQuestionPool(null)).WillReturn(validation);
试试看,看看它是如何运行的。您可能还会在Typemock Tracer实用程序中观察,以便在运行测试时看到正在设置的期望值,以确保没有设置其他期望,而不是期待。