2011-01-21 75 views
3

我正在使用Rhino模拟3.6版本库和Nhibernate。但我得到ExpectationViolationException预期#0,实际#1。我花了两天时间。我不知道我做错了什么。这是我的代码。我在mockRepository.Save(用户)行发生错误。犀牛模拟3.6存储库预期#0,实际#1

 var username = "abcdef"; 
     var mocks = new MockRepository(); 
     var validationResults = new ValidationResults(); 
     IDataQuery query = mocks.StrictMock<IDataQuery>(); 
     UserRepository mockRepository = mocks.StrictMock<UserRepository>(query); 
     var user = mocks.StrictMock<User>(); 

     user.FirstName = "javed"; 
     user.LastName = "ahmad"; 
     user.UserName = "abc"; 
     user.Password = "password"; 
     user.Email = "[email protected]"; 
     user.IsActive = true; 
     user.CreatedBy = 1000000; 
     user.CreatedDate = DateTime.Today; 
     user.ModifiedBy = 1000000; 
     user.ModifiedDate = DateTime.Today; 

     Expect.Call(user.Validate()).Return(validationResults); 
     mocks.ReplayAll(); 

     mockRepository.Save(user); 

在此先感谢。

感谢 伊姆兰

回答

0

你似乎是嘲笑一切甚至SUT即userrepository 你应该对将在userrepository内部使用的接口设置嘲笑。您将需要将这些传递给userrepository来以某种方式覆盖它们的默认行为。

你需要决定你真正想测试的东西。

上面的代码意味着下面我

class UserRepository 
{ 
    public void Save(IUser user) 
    { 
    validationResult = user.Validate(); 
    if (validationResult==null) 
    { 
     dal.Save(user); 
    } 
    } 
} 

这只是一个猜测,但问题是你现在已经只能嘲笑用户,如果你的目的是要测试的验证方法是代码在userrepository.save方法内调用

+1

你也可能想要查看rhino mock的AAA语法,这很容易理解 – Andrew 2011-01-21 21:02:20

6

您正在使用StrickMock,这意味着您认为有效的唯一调用是您为期望设置的调用。由于您没有设置Save将会被调用的期望值,因此您会收到错误消息。

1

通常这意味着RhinoMock期望您调用一次user.Validate(),但您调用该方法两次。您可以检查您是否只调用一次该方法或更改

Expect.Call(user.Validate())。Return(validationResults);

Expect.Call(user.Validate())返回(validationResults).Repeat.Twice();