C# 为什么可以';我是否更改Rhino Mocks存根对象中的返回值?

C# 为什么可以';我是否更改Rhino Mocks存根对象中的返回值?,c#,unit-testing,mocking,rhino-mocks,stub,C#,Unit Testing,Mocking,Rhino Mocks,Stub,如果这是一个愚蠢的问题,请原谅我,但我对嘲弄是相当陌生的,我正试图让我的头脑绕过它 我有一些单元测试(使用内置的VisualStudio2010专业测试功能),它们使用方法所需的存根。我创建了一个存根,并为几个属性和一个方法设置了默认返回值,所有这些都很好地工作。我有一个设置存根的静态类,它在TestInitialize方法中用于设置存根 public static AppointmentReminderProviderInterface GetMockProvider() { Appoin

如果这是一个愚蠢的问题,请原谅我,但我对嘲弄是相当陌生的,我正试图让我的头脑绕过它

我有一些单元测试(使用内置的VisualStudio2010专业测试功能),它们使用方法所需的存根。我创建了一个存根,并为几个属性和一个方法设置了默认返回值,所有这些都很好地工作。我有一个设置存根的静态类,它在
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;
}
Debug.WriteLine()
告诉我,尽管我已经将
ContactEmail
属性设置为返回“invalid”,但它仍然返回默认的电子邮件地址。这会导致我的测试失败,因为我希望它抛出一个异常,但它没有

有人知道我为什么不能更改此属性的返回值吗

谢谢你的帮助。

试试换衣服

_provider.Stub(p => p.ContactEmail).Return("invalid");


假设ContactEmail有一个setter,这应该可以工作。如果这不能解决您的问题,我会按照Alexander Stepaniuk的建议重构您的测试,这样您就不会为同一存根添加多个行为;我认为这与你的问题有关

作为一个棘手但有效的解决方案,我建议在这里使用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"
var providerContactEmail=“Email1”;
供应商
.Stub(p=>p.ContactEmail)
.Do((Func)(()=>providerContactEmail));
//此处provider.ContactEmail返回“Email1”
providerContactEmail=“Email2”;
//现在provider.ContactEmail返回“Email2”

但是,在我看来,如果能找到在测试中不改变返回值的解决方案,那就更好了。p> 我从未使用过Rhino mock,但在其他mock框架中,我在多次设置返回值时使用过,就像在您的例子中一样,第一个值在第一个方法/属性调用中返回,第二个值在您第二次访问该成员时返回(等等,等等,最后的值集通常会在以后的调用中返回)。你好,Allon,谢谢你的回复。如果你的建议是正确的,那么我显示的Debug.WriteLine调用应该输出“invalid”值,然后测试方法本身应该被赋予原始值再次感谢。再次感谢。重新设计您的测试,这样您就不需要在测试期间更改存根返回值。您只需定义一次返回值。您好,感谢您的回复。不幸的是,ContactEmail没有setter,缺少一些诡计,我无法直接设置。我通过设置一个单独的设置暂时解决了这个问题e存根带有无效的电子邮件地址,但随着我想要测试的组合数量的增加,我可以看到这是一个巨大的痛苦。我希望我可以从一个默认存根开始,并在测试开始时修改我想要的属性。看起来我将在测试中得到大量几乎相同的代码。当然我不是第一个面对这个问题的人?ThanksHow:创建一个方法,用您需要的特定值重新创建整个存根对象。这将允许您在大多数测试中使用默认情况,然后在需要默认情况以外的内容时创建一个全新的提供程序。另一个建议的答案是使用Do met霍德可能也会完成这项工作。

_provider.ContactEmail = "invalid";
var providerContactEmail = "Email1";

provider
    .Stub(p => p.ContactEmail)
    .Do((Func<string>)(() => providerContactEmail));
// here provider.ContactEmail returns "Email1"

providerContactEmail = "Email2";
// now provider.ContactEmail returns "Email2"