2017-10-16 15 views
2

나는 FakeItEasy에서 이상한 문제를 경험합니다.FakeItEasy는 전화를 찾지 못하지만

단위 테스트 방법에 따라 상상 :

[TestMethod] 
public void DeletePerson_WhenCalled_ThenPersonIsDeleted() 
{ 
    const int personId = 24; 
    var commonParam = new CommonParam(); 

    this.testee.DeletePerson(commonParam, personId); 

    A.CallTo(() => this.personRepository.DeletePersons(commonParam, new[] {personId }, false)).MustHaveHappened(Repeated.Exactly.Once); 
    A.CallTo(() => this.personRepository.SaveChanges()).MustHaveHappened(Repeated.Exactly.Once); 
} 

testee.DeletePerson -method은 다음과 같습니다

public ResultatModel DeletePerson(CommonParam commonParam, int personId) 
{ 
    this.personRepository.DeletePersons(commonParam, new[] { personId }); 
    this.personRepository.SaveChanges(); 
} 

그리고 personRepository.DeletePersons (하지만이 하나 ... fakeiteasy에 의해 위조됩니다) :

public void DeletePersons(CommonParam commonParam, IEnumerable<int> ids, bool hardRemove = false) 
    { 
      var persons = Entities.per_person.Where(e => ids.Contains(e.personId) 
      && (e.accountId == null || e.accountId == commonParam.AccountId)).ToList(); 

     if (hardRemove) 
     { 
      Entities.per_person.RemoveRange(persons); 
     } 
     else 
     { 
      persons.ForEach(person => 
      { 
       person.geloescht = true; 
       person.mutationsBenutzer = commonParam.DbIdent; 
       person.mutationsDatum = DateTime.Now; 
      }); 
     } 
    } 

이 때문에 테스트가 실패하는 이유는

입니다.

시험 방법 DataService.Test.PersonServiceTest.DeletePerson_WhenCalled_ThenPersonIsDeleted은 예외를 던졌다 : FakeItEasy.ExpectationException :

어설 다음 호출에 실패했습니다 RepositoryContract.IPersonRepository.DeletePersons (commonParam : Commons.CommonParam, IDS : 시스템. INT32 [], hardRemove : 거짓) 은 통화 중이 # 0 번을 정확히 한 번만 찾을 것으로 예상하지만, 발견 1 : RepositoryContract.IPersonRepository.RequestInfo = 위조 Commons.Session.RequestInfo 2 : RepositoryContract.IPersonRepository.DeletePersons을 ( commonParam : Commons.CommonParam, IDS : 3) 거짓 : 선택 System.Int32 [], hardRemove RepositoryContract.IPersonRepository.SaveChanges()

왜 테스트가 실패 하는가?

new[] { ... }은 문제가 아닙니까? 사전에

감사

답변

4

새로운 [] {...}이 (가) 문제가 있습니까?

,
MustHaveHappened(Repeated.Exactly.Once) 조롱 방법은 당신이 모의 구성에서 제공하는 동일한 매개 변수와 함께 호출 될 경우에만 "통과"합니다. 당신이 시험 방법에 동일한 인스턴스를 통과하기 때문에

A.CallTo(() => this.personRepository.DeletePersons(commonParam, new[] {personId }, false)) 
.MustHaveHappened(Repeated.Exactly.Once); 

commonParam의 경우는, 작동합니다.

new[] {personId }의 경우 모의 구성에서 제공된 배열과 테스트중인 메서드에서 제공된 인스턴스가 int[]의 다른 인스턴스이기 때문에 작동하지 않습니다.

당신은

A.CallTo(() => this.personRepository.DeletePersons(
        commonParam, 
        A<IEnumerable<int>>.That.Matches(ids => ids.Single() == personId), 
        false)) 
.MustHaveHappened(Repeated.Exactly.Once); 

일치하는 사용자 정의 인수를 사용 또는 토마스 제안 특정 사건에 대한 더 편리하고 읽을 수 일치를 사용할 수 있습니다. More convenience matchers

0

는 새로운 [] {...} 문제인가?

네 말이 맞습니다. new[]은 {...} 사이에 사용하는 형식으로 배열을 만듭니다 (컴파일러에서 가정합니다). 그러나 메서드 선언은 IEnumerable<int> ids을 사용합니다. 기본적으로 테스트 호출은 서명 불일치로 인해 잘못되었거나 존재하지 않는 메서드를 호출합니다.

+0

흠 당신은 확신? 제 말은'new [] {...}'도'IEnumerable '입니까? 'new List {...}'호출을 변경하려고 시도했지만 여전히 작동하지 않습니다 .-- ( – xeraphim

+0

런타임에 컴파일 타임에 없습니다. . – dbencs

4

파비오는 정확하지만, 당신은 좀 더 간단 할 수 있습니다 :

A.CallTo(() => this.personRepository.DeletePersons(
       commonParam, 
       A<IEnumerable<int>>.That.IsSameSequenceAs(personId), 
       false)) 
.MustHaveHappened(Repeated.Exactly.Once);