2014-02-23 1 views
1

아무 것도 반환하지 않는 메서드의 단위 테스트를 수행하려고합니다. 나는 이것을 위해 xUnit을 사용하고있다. Google에서 검색하지만 메소드가 반환하는 모든 부분을 검색합니다.xUnit을 사용하여 Void 메소드를 테스트하는 방법은 무엇입니까?

여기 내 코드입니다 :

나의 등급 :

public class ShopRepository : BaseRepository<ShopInformation> 
{ 
    public ShopRepository(IDbContext dbContext) 
     : base(dbContext) 
    { 
    } 

    public override void Update(ShopInformation entity) 
    { 
     if(GetAll().Any()) 
      base.Update(entity); 
     else 
     base.Add(entity); 
    } 

    public ShopInformation ShopInformation() 
    { 
     return GetAll().FirstOrDefault(); 
    } 
} 

내 테스트 :

나는 base.Update(entity); 통화인지 확인 ShopRepository 클래스의 Update 방법을 테스트해야
[Fact] 
    public void GetAllTest() 
    { 
     var data = new List<ShopInformation> 
     { 
      new ShopInformation { Name = "BBB" }, 
      new ShopInformation { Name = "ZZZ" }, 
      new ShopInformation { Name = "AAA" }, 
     }.AsQueryable(); 

     var mockSet = Mock.Create<DbSet<ShopInformation>>(); 
     Mock.Arrange(() => ((IEnumerable<ShopInformation>)mockSet).GetEnumerator()).Returns(data.GetEnumerator); 

     Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).Provider).Returns(data.Provider); 

     Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).Expression).Returns(data.Expression); 
     Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).ElementType).Returns(data.ElementType); 
     Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).GetEnumerator()).Returns(data.GetEnumerator()); 
     var interDbContext = Mock.Create<IDbContext>(); 
     interDbContext.Arrange(x => x.Set<ShopInformation>()).Returns(mockSet); 

     var companyRepository = new ShopRepository(interDbContext); 

     companyRepository.Update(new ShopInformation()); 

     //??????????????? 

    } 

. 그러나 그것을하는 방법을 이해하지 마십시오.

내가 사용하고 있습니다 :

  • 비주얼 스튜디오 2013 얼티밋.
  • 그냥 모의 2013.3.1015
  • xUnit의이 개 가능한 솔루션이 1.9.2

답변

0

:

  1. 업데이트 방법은 ShopRepository 클래스의 값을 수정하는 경우, 당신은 일부 유효성 검사를 수행한다 그들.

  2. 모의 밖으로 base.Update 메서드는 "expected"를 반환하고이를 기반으로합니다.

0

귀하의 시험 GetAllTest()라는, 그래서 아마 Update() 기능을 테스트 할 수 없습니다.

가장 좋은 방법은 업데이트 여부를 알려주는 것입니다.

public bool Update(ShopInformation entity) 
{ 
    if(GetAll().Any()) 
    { 
     base.Update(entity); 
     return true; // True because it updated 
    } 
    else 
    { 
     base.Add(entity); 
     return false; // False because it didn't 
    } 
} 

그러면 테스트 결과는 Assert입니다.

// ... Setup test code 
var hasUpdated = companyRepository.Update(new ShopInformation()); 
Assert.Equal(true, hasUpdated); 

점 는주의하십시오 : 당신이 저장소를 사용하는 경우, 당신은 아마 변경 사항을 업데이트합니다이 같은 Save를 사용해야하지만, 레코드가 이미 존재하지 않는 경우도 새 레코드를 추가합니다.