当使用带ref参数的mock方法时,assert MustHaveHappened失败



我使用FakeItEasy模拟单元测试的方法。其中一种方法(使用REF参数- 也许这是重要的)将数据保存在数据库中,所以它被嘲笑为'什么都不做'

A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).DoesNothing();

。但是在这种情况下,last assert失败

A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).MustHaveHappened(Repeated.Exactly.Once);

错误提示:

Assertion failed for the following call:
    MobileWallet.Common.DAL.IMwbeUserRepository.Save(<NULL>)
  Expected to find it exactly once but found it #0 times among the calls:
    1: MobileWallet.Common.DAL.IMwbeUserRepository.Get(userName: "AAA")
    2: MobileWallet.Common.DAL.IMwbeUserRepository.Save(user: MobileWallet.Common.Repository.MwbeUserData)

测试的完整代码

[TestMethod]
public void AddUser_MwbeUserObjectReturned()
{
    //Arrange
    MwbeUserRegistrationIn userRegistrationIn = new MwbeUserRegistrationIn()
    {
        BirthDate = DateTime.Today,
        Email = "www@wp.pl",
        FirstName = "Adam",
        SecondName = "Ada2",
        UserName = "AAA"
    };
    //mock mockedNotificationService and related: 
    INotificationService mockedNotificationService = A.Fake<INotificationService>();
    //TODO: create notofication service
    //mock IMwbeUserRepository and related
    IMwbeUserRepository mockedUserRepository = A.Fake<IMwbeUserRepository>();
    MwbeReturnData<MwbeUserData> mwbeReturnData = new MwbeReturnData<MwbeUserData>(MwbeResponseCodes.NotFound);          
    MwbeUserData mwbeUserData = mwbeReturnData.Data;
    A.CallTo(() => mockedUserRepository.Get(userRegistrationIn.UserName)).Returns(mwbeReturnData);
    A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).DoesNothing();
    MwbeUserService userService = new MwbeUserService(mockedUserRepository, mockedNotificationService);
    //Act
    MwbeUser user = userService.AddUser(userRegistrationIn);
    //Assert
    Assert.IsNotNull(user);            
    Assert.AreEqual(userRegistrationIn.Email, user.Email);
    Assert.AreEqual(userRegistrationIn.UserName, user.UserName);
    Assert.AreEqual(userRegistrationIn.FirstName,user.FirstName);
    Assert.AreEqual(userRegistrationIn.SecondName, user.SecondName);
    Assert.AreEqual(userRegistrationIn.BirthDate, user.BirthDate);
    A.CallTo(() => mockedUserRepository.Get(userRegistrationIn.UserName)).MustHaveHappened(Repeated.Exactly.Once);
    A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).MustHaveHappened(Repeated.Exactly.Once);
}
更新1:

请注意,对于这个方法Save的两次调用,mwbeUserData的值是相同的

MwbeUserData mwbeUserData = mwbeReturnData.Data;

如果这是null(但它不是)。

也许是语法的问题REF参数?我读到应该使用的方法称为AssignsOutAndRefParameters,但我不知道确切地如何使用它。

现在我将使用MATCHES参数使其更通用。

我认为它发生了,因为你断言mwbeUserData实例

@老狐狸有权利。

您正在询问FakeItEasy是否使用null输入调用mockedUserRepository.Save(ref mwbeUserData) (mwbeUserData必须在您进行检查时为空)。它没有看到这样的东西,因为在AddUser中传递给mockedUserRepository.SaveMwbeUserData似乎不是空的。

如果你认为测试应该已经通过,也许放松你的约束会有所帮助,因为在FakeItEasy: mock方法没有返回预期的结果。

还要注意,参数的ref度对这种行为没有影响。对于"普通"参数也会发生相同的约束匹配。默认只豁免out参数。更多信息请参阅FakeItEasy文档中的参数约束,以及如何使用自定义参数匹配器。

相关内容

  • 没有找到相关文章

最新更新