LambdaExpression比较

时间:2010-11-28 14:57:47

标签: c# lambda rhino-mocks bdd mspec

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

有没有办法使用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);

问题是我想将方法​​不是任何Lambda表达式,只是针对特定的lambda表达式 "x=>x.Id==userId && user.IsActive ==true",以便测试将如果此表达式在方法中发生更改,则会失败...

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

对此有任何建议, 感谢

1 个答案:

答案 0 :(得分: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.
}