1

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

有什么方法可以使用 Rhino Mocks 为使用 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);

问题是我想把方法存根不是Any Lambda Expression,只是针对特定的 lambda 表达式 "x=>x.Id==userId && user.IsActive ==true",这样如果这个表达式在方法中发生变化,测试就会失败......

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

感谢对此的任何建议,谢谢

4

1 回答 1

2

您不想测试该方法中是否使用了特定的 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.
}
于 2010-11-28T15:03:37.370 回答