2012-02-06 6 views
1

NHibernate 저장소 메소드를 테스트하는 데 몇 가지 어려움이 있습니다. 기본적으로 표현식이 전달되고 IQueryable을 반환하기 때문입니다.유닛 테스트 NHibernate 저장소

여기 저장소 방법 중 하나 :

public TEntity FindBy<TEntity>(Expression<Func<TEntity, bool>> expression) 
{ 
    return Session.Query<TEntity>().SingleOrDefault(expression); 
} 

와 현재 관련 메서드 호출 :

public Employee Login(string username, string password) 
{ 
    return Repository.FindBy<Employee> 
    (
     e => e.Active 
      && e.Username.ToLower() == username.ToLower() 
      && e.Password == password 
    ); 
} 

및 관련 단위 테스트 :

[Test] 
public void ForMatchingEmployeeUsernameAndPassword_ReturnsEmployee() 
{  
    var employee = HelperEmployee.GetEmployee(); 

    repository.Setup(x => x.FindBy(It.IsAny<Expression<Func<Employee, bool>>>())).Returns(employee); 

    var result = EmployeeService.Login(employee.Username, employee.Password); 

    Assert.IsNotNull(result); 
    Assert.IsInstanceOf<Employee>(result); 
    Assert.AreSame(employee, result); 
} 
0,123,

및 테스트 설정 방법 : I 시도하고 저장소 방법을 조롱 할 때

[SetUp] 
public void Init() 
{ 
    mock = new Mock<IRepository>(); 
    repository = mock.Object; 
    EmployeeService = new EmployeeService(repository); 
} 

내 문제는 내가 그것을 반환 결과에 로직을 실행하기보다는 그것에 논리를 통과하고있어, 발생한다. 그래서 내가 그것을 무시하고 내가 모의 작업에서 설정 한 것을 되돌려 놓기 때문에 내 논리를 테스트하는 것은 어렵습니다.

내가 잘못 가고있는 아이디어가 있습니까? 더 많은 정보를 제공해 주시면 ...

+1

'EmployeeService'에 주입됩니다. 'EmployeeService'를 어떻게 구성하고 있습니까? – Jonathan

+0

안녕하세요, Jonathon, 저는 테스트 픽스쳐 SetUp 메소드에 주입하고 있습니다 : EmployeeService = new EmployeeService (repository); – timothyclifford

+1

게시 한 테스트의 첫 번째 행은'저장소 '의 정의를 보여줍니다. 이것은'SetUp' 메쏘드가 호출 된 이후에 발생합니다. 이것은 모의이 사용되지 않는다는 것을 의미합니다. 아마도 위의'SetUp' 메소드를 추가하십시오. – Jonathan

답변

1

NUnit과 RhinoMocks를 사용하여 수행하려는 작업 샘플을 얻을 수 있었다고 생각합니다. 이 모든 테스트는 FindBy이 호출되었는지 확인하는 것입니다. 올바른 필터 표현식이 적용되고 있음을 알려면 통합 테스트가 필요하다고 생각합니다. 은`repository` 인스턴스에 표시되지 않습니다

IRepository

public interface IRepository 
{ 
    TEntity FindBy<TEntity>(Expression<Func<TEntity, bool>> expression); 
} 

LoginService

public class LoginService 
{ 
    private readonly IRepository _repository; 

    public LoginService(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public Employee Login(string username, string password) 
    { 
     return _repository.FindBy<Employee> 
     (
      e => e.Active 
       && e.Username.ToLower() == username.ToLower() 
       && e.Password == password 
     ); 
    } 
} 

LoginServiceTests

[TestFixture] 
class LoginServiceTests 
{ 
    private IRepository _repository; 
    private LoginService _loginService; 

    [SetUp] 
    public void Setup() 
    { 
     _repository = MockRepository.GenerateMock<IRepository>(); 
     _loginService = new LoginService(_repository); 
    } 

    [Test] 
    public void Login_should_return_employee() 
    { 
     var expected = new Employee { Username = "Jon" }; 

     _repository.Expect(f => f.FindBy(Arg<Expression<Func<Employee, bool>>>.Is.Anything)).Return(expected); 

     var result = _loginService.Login("jon", "mysecret"); 

     Assert.That(result, Is.InstanceOf<Employee>()); 
     Assert.That(result, Is.EqualTo(expected)); 
    } 
} 
+0

감사합니다 도움이 친구, 내가 약간 잘못된 경로를 논리보다는 저장소 방법을 테스트하려고 아래로 갈 것이라고 생각 :) – timothyclifford