Сравнение LambdaExpression - PullRequest
       10

Сравнение LambdaExpression

1 голос
/ 28 ноября 2010

Я играл с тестированием, используя технические характеристики машины, и есть кое-что, что я просто не в состоянии сделать, задавался вопросом, был ли кто-то там раньше,

Есть ли способ использовать Rhino Mocks для создания заглушки для метода, использующего лямбда-выражение, я обнаружил, что могу сделать следующее

Наличие этого метода в примере класса:

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);

Дело в том, что я хотел бы заглушить метод, чтобы не Любое лямбда-выражение , только для специфического лямбда-выражения "x=>x.Id==userId && user.IsActive ==true", чтобы тест не выполнялся, если это выражение изменения в методе ...

Полагаю, я мог бы создать фиктивный репозиторий, который не идет в базу данных, и протестировать поведение в лямбда-выражении, хотя, мне было интересно, есть ли другой подход к этому ...

Ценю любые предложения по этому вопросу, Спасибо

1 Ответ

2 голосов
/ 28 ноября 2010

Вы не хотите проверять, что определенное лямбда-выражение используется в методе.Вы хотите проверить поведение, которое должен иметь метод.Тестирование деталей реализации, таких как конкретное лямбда-выражение, в целом слишком хрупко.Вместо:

[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.
}
...