[英]Why can't I change the return value in a Rhino Mocks stub object?
如果这是一个愚蠢的问题,请原谅我,但我在嘲笑方面还很陌生,并且正在努力解决这个问题。
我有一些单元测试(使用内置的Visual Studio 2010 Professional测试功能),这些单元测试使用方法所需的存根。 我创建了一个存根,并为几个属性和方法设置了默认的返回值,并且一切正常。 我有一个设置存根的静态类,它在TestInitialize
方法中用于设置存根...
public static AppointmentReminderProviderInterface GetMockProvider() {
AppointmentReminderProviderInterface provider = MockRepository.GenerateStub<AppointmentReminderProviderInterface>();
provider.Stub(p => p.ContactName).Return(MockProviderContactName);
provider.Stub(p => p.ContactEmail).Return(MockProviderContactEmail);
return provider;
}
请注意, MockProviderContactName
和MockProviderContactEmail
是本地字符串属性,其中包含提供程序的默认数据。 检查默认数据是否按预期工作的单元tst全部合格。
但是,我现在要测试当这些属性之一包含duff数据时会发生什么。 我以为我可以在存根上设置它,但是它不起作用。 测试方法包含以下几行...
_provider.Stub(p => p.ContactEmail).Return("invalid");
Debug.WriteLine("Provider email: <" + _provider.ContactEmail + ">");
Debug.WriteLine()
向我显示,尽管事实上我已将ContactEmail
属性设置为返回“无效”,但它仍会返回默认电子邮件地址。 这导致我的测试失败,因为我期望它会引发异常,而事实并非如此。
有人知道为什么我不能更改此属性的返回值吗?
谢谢你的帮助。
作为一个棘手但可行的解决方案,我建议在这里使用Do handler 。 它允许为存根方法/属性实现一些逻辑。
参见示例:
var providerContactEmail = "Email1";
provider
.Stub(p => p.ContactEmail)
.Do((Func<string>)(() => providerContactEmail));
// here provider.ContactEmail returns "Email1"
providerContactEmail = "Email2";
// now provider.ContactEmail returns "Email2"
但是我认为最好能找到一种解决方案,该解决方案允许在测试过程中不更改返回值。 :)
尝试改变
_provider.Stub(p => p.ContactEmail).Return("invalid");
至
_provider.ContactEmail = "invalid";
假设ContactEmail有一个setter,这应该可以工作。 如果这不能解决您的问题,我将遵循Alexander Stepaniuk的建议并重构您的测试,以便您不会为同一存根添加多个行为; 我认为这与您的问题有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.