2010-11-28 2 views
1

나는 기계 사양을 사용하여 테스트를 주위에 놀고 있었다 그리고 난 할 수 그냥 나는 뭔가가, LambdaExpression 누군가가 전에 거기 경우 비교

만들 코뿔소 모의 객체를 사용하여 어떤 방법이 궁금했다

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"를 들어, 모든 람다 식을 하지 않는 방법을 스텁하고자하는 것입니다 ...

나는

가 어떤 제안을 감사합니다 ... 내가 데이터베이스로 이동이 또 다른 방법이 있다면, 내가 궁금 해서요이 비록 람다의 동작을 테스트하지 않는 모의 저장소를 만들 수있을 것 같아요 this, 감사합니다.

+0

"bdd"는 질문에서 태그로 사용할 때 무엇을 의미합니까? 나는 당신이 이진 결정 다이어그램을 의미하지 않는다고 생각합니다 ... –

+0

@Pascal Cuoq : 행동 주도 개발 : http://en.wikipedia.org/wiki/Behavior_Driven_Development. – jason

답변

2

메서드에서 특정 람다식이 사용되는지 테스트하고 싶지는 않습니다. 메서드에있는 동작을 테스트하려고합니다. 특정 람다 식과 같은 구현 세부 정보를 테스트하는 것은 일반적으로 너무 취약합니다. 대신 :

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

감사합니다. –