2016-12-27 6 views
1

JustMock 및 Entity Framework를 사용하여 서비스의 단위 테스트를 작성하려고합니다. 서비스, ​​나는이 방법이 있습니다다른 클래스 안에 JustMock을 사용하여 Entity Framework 클래스 모의

List<Log> GetLogType(string type) 
{ 
    using (var db = new LogContext()) 
    { 
     return db.Logs.Where(x => x.Type == type).ToList(); 
    } 
} 

을 그리고 시험이 있습니다

[TestMethod] 
public void GetLogTypeTest() 
{ 
    IList<Log> logs = new List<Log> 
    { 
     new Log() { 
      Id = 1, 
      Type = "Debug", 
      Message = "Test Message" 
     } 
    }; 

    var logContext = Mock.Create<LogContext>(Constructor.Mocked).PrepareMock(); 
    logContext.Logs.Bind(logs); 

    var service = new LogService(); 

    var debugs = service.GetLogType("Debug"); 

    Assert.AreEqual(1, debugs.Count()); 
} 

은 어떻게받을 수 있나요 내 조롱 컨텍스트를 사용하는 서비스를? 지금은 데이터베이스에 연결하려고 시도하고 있으므로 오류가 발생합니다.

답변

2

이유는

이는 JustMock의 일이 아니다. 그것은 당신의 방법으로 LogContext의 새로운 인스턴스를 생성했기 때문에 발생했습니다. 귀하의 방법은 항상 새로운 서비스 인스턴스를 생성하고 실제 데이터베이스와 연결하기 때문에 단위 테스트 할 수 없습니다. C#에 적합한 여러 가지 종속성 주입 프레임 워크가 있습니다. 관심이 있으시면 Unity을 검토하십시오.

당신은 의존성 주입을 사용하고 수업 시간에 서비스를 주입 할 필요가 본

해결하려면. 이 경우 데이터베이스 연결을 피할 수 있습니다. 귀하의 방법은 다음과 같이 될 것입니다 :

List<Log> GetLogType(string type) 
{ 
    return _logContext.Logs.Where(x => x.Type == type).ToList();  
} 

_logContext가 저점 생성자를 주입 LogContext 타입의 전역 변수는

.

너는 그것을 모의하고 가짜 물마루 생성자를 전달할 수있다. 클래스의

예가 될 수 있습니다

public class LogService 
{ 
    private readonly LogContext _logContext; 

    public LogService(LogContext logContext) 
    { 
     _logContext = logContext; 
    } 

    List<Log> GetLogType(string type) 
    { 
     return _logContext.Logs.Where(x => x.Type == type).ToList();  
    } 
} 

이제 당신은 다음과 같은 테스트 케이스를 만들 수 있습니다

[TestMethod] 
public void GetLogTypeTest() 
{ 
    IList<Log> logs = new List<Log> 
    { 
     new Log() { 
      Id = 1, 
      Type = "Debug", 
      Message = "Test Message" 
     } 
    }; 

    var logContext = Mock.Create<LogContext>(Constructor.Mocked).PrepareMock(); 
    logContext.Logs.Bind(logs); 

    var service = new LogService(logContext); 

    var debugs = service.GetLogType("Debug"); 

    Assert.AreEqual(1, debugs.Count()); 
} 

내가 무슨 짓을 유의하시기 바랍니다. 내가 너처럼 service 인스턴스를 만들었지 만 실제 서비스 물마루 생성자의 조롱 된 인스턴스를 삽입했습니다. 조롱 된 인스턴스는 데이터베이스에 절대 연결되지 않으며 구성에서 제공 한 데이터를 반환합니다.

+0

감사합니다. 내가 잘못 접근 한 것 같습니다. 많은 리팩토링을해야하지만이 방법이 효과적입니다. – RossD

+0

문제 없습니다. 의존성 주입 없이는 훌륭한 단위 테스트를 수행 할 수 없습니다. DI를 사용하지 않으려는 경우에도 통합 테스트를 수행 할 수는 있지만 테스트 데이터베이스를 만들고 테스트 프로젝트의 app.config에서 해당 DB를 가리 키도록 연결 문자열을 설정해야합니다. – kat1330