2012-09-21 5 views
1

GetUsersForRole이라는 서비스를 테스트하려고합니다. 그것은 간단한 문자열을 취하며 NHibernate를 다루고 RoleName에 전달 된 문자열을 가진 역할 모음을 가져 오기 위해이 역할을 내 RoleRepository로 전달합니다. 이렇게하려면이 코드를 호출 내 RoleRepository에 찾기 기능이 있습니다NHibernate가 내 Iesi에게하는 것은 무엇입니까? 집결입니까?

ICriteria crit = rb.unitOfWork.Session.CreateCriteria(typeof(Entity)); 
crit.SetCacheable(false); 
foreach (object[] criteriaItem in criteria) 
{ 
    crit.Add(Expression.Eq((string)criteriaItem[0], criteriaItem[1])); 
} 

return crit.List().Cast<Entity>(); 

그래서 위의 코드 역할을하고 내 목록을 반환됩니다, Iesi.Collections.ISet으로 정의 속성이라고 사용자. 주어진 역할에 사용자가 묶여 있다면 (many-to-many를 통해),이 특성이 채워집니다.

여기에서이 Find 함수의 결과를 처리하고 첫 번째 역할을 얻은 다음 ValueInjector를 사용하여 role.Users 속성을 IEnumerable 집합에 매핑합니다. 이것은 100 % 작동합니다.

var role = _roleRepo.Find(new List<object[]>() 
           { 
            new object[] {"Name", roleName} 
           }).FirstOrDefault(); 

if (role == null) 
    return null; 

MapperFactory.ClearMappers(); 
MapperFactory.AddMapper(new ISetToIEnumerable<User, UserDTO>()); 

var users = Mapper.Map<Iesi.Collections.ISet, IEnumerable<UserDTO>>(role.Users); 

return users; 

내가 설정 매핑을 처리 할 가치 인젝터의 Automapper 시뮬레이션 클래스를 사용하고 있습니다 : 다음은이를 수행하는 코드이다. 이 내용은 here입니다.

public class ISetToIEnumerable<TSource, TTarget> : TypeMapper<Iesi.Collections.ISet, IEnumerable<TTarget>> 
{ 
    public override IEnumerable<TTarget> Map(Iesi.Collections.ISet source, IEnumerable<TTarget> target) 
    { 
     base.Map(source, target); 

     List<TTarget> entities = new List<TTarget>(); 
     foreach (var entity in source) 
     { 
      entities.Add(Mapper.Map<TSource, TTarget>((TSource)entity)); 
     } 
     target = entities.AsEnumerable(); 
     return target; 
    } 
} 

는 다시, 이것은 100 % 작동 : 나는 특별한 매퍼는 IEnumerable 매핑에 Iesi.Collections.ISet 작업을했습니다. ISetToIEnumerable 매퍼 클래스에서 인수 원본은 Iesi.Collections.ISet {NHibernate.Collection.PersistantSet}로 나타납니다. 이것은 유닛 테스트를 시도 할 때 상황이 엉망이되는 곳입니다. 나는이 디버깅하고 service.GetUsersForRole ("role1") 호출을 한 단계 때

[Test] 
    public void GetUsersForRole_success() 
    { 
     // Arrange 
     var roles = new List<Role>(); 
     var role = new Role() 
         { 
          Name = "role1", 
          Users = {new User() {Username = "user1"}, new User() {Username = "user2"}} 
         }; 
     roles.Add(role); 

     _mockRoleRepository.Setup(m => m.Find(It.IsAny<IList<object[]>>())).Returns(roles); 

     var service = GetDefaultService(); 

     // Act 
     var users = service.GetUsersForRole("role1"); 

     Assert.That(users.Count() == 2); 
    } 

, 나는에서 나의 조롱 데이터를 얻을 :

나는이 단위 테스트와 성공적인 실행을 테스트하기 위해 노력하고있어 내 mockRoleRepository. 여기서 문제는 내 role.Users 속성은 Iesi.Collections.HashedSet (이것은 NHibernate를 사용하여 테스트 및 실제 실행을 위해 내 Entity Constructor에서 인스턴스화되는 방식입니다.) 유형으로 되돌아갑니다. 이제 이것이 ISetToIEnumerable 클래스의 주요 문제가되었습니다. 내 소스는 Iesi.Collections.HashSet과 같이 입력됩니다.

NHibernate 세션 인스턴스가 없기 때문에 NHibernate.Collection.PersistantSet을 사용하여 모의를 입력 할 수 없다는 것을 알고 있습니다. 아무도 여기에 무슨 일이 일어나고 있는지에 대해 어떤 생각을 가지고 있고 어떻게 NHibernate가 Iesi로하고있는 것을 복제 할 수 있을지 모르겠다. 집계. 내 모의 데이터 정리에 있습니까?

답변

0

내가 맞다고 이해하면 도메인 모델에 ISet<T>이 있습니까? 왜 이것을 매퍼에서 소스로 사용하지 않습니까? 왜 비 제네릭 인터페이스입니까?

또 다른 대안은 매퍼에서 소스로 IEnumerable과 같은 제네릭 인터페이스와 비 제너릭 인터페이스 모두에 대한 일반 인터페이스를 사용하는 것입니다.