我正在使用机器规格进行测试,我只是无法做的事情,想知道是否有人去过那里,

有什么方法可以使用犀牛模拟为使用lambda表达式的方法创建一个存根,我发现我可以做以下操作

在样本类中具有此方法:

public void UpdateVisit(int userId){
    var user = repository.FindBy<User>(x=>x.Id==userId && user.IsActive ==true);
    user.Visit = user.Visit + 1;
    repository.Save(user);
}

我可以用这样的方法存根:

//...Inside test method
var user = new User();
repository.Stub(x=>x.FindBy<User>(Arg<Expression<Func<User,bool>>>.Is.Anything)).Return(user);

问题是我想让方法不 任何lambda表达, ,只是为了 特定的lambda表达 "x=>x.Id==userId && user.IsActive ==true", ,使得测试如果此表达式在方法中发生变化,则测试将失败。

我想我可以创建一个模拟存储库,该存储库不会转到数据库并测试lambda中的行为,但我想知道是否还有另一种方法...

感谢任何建议,谢谢

有帮助吗?

解决方案

您不想测试该方法中使用的特定lambda表达式。您想测试该方法应该具有的行为。一般而言,测试实现细节(例如特定的lambda表达式)太脆了。反而:

[Fact]
UpdateVisit_updates_Visit_for_user_that_is_in_the_repository_and_is_active() {
    // set up mock repository with dummy user having
    // userId == 1,
    // IsActive == true,
    // Visit = 42
    // invoke UpdateVisit
    // pull userId == 1 from the repository
    Assert.Equal(43, user.Visit);
}

[Fact]
UpdateVisit_does_not_update_visit_for_user_that_is_not_active() {
    // etc.
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top