2016-12-27 12 views
1

Я использую JustMock и Entity Framework, чтобы попытаться написать модульные тесты для службы. В службе, у меня есть этот метод:Макет класса Entity Framework с JustMock внутри другого класса

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 вашего тестового проекта. – kat1330

 Смежные вопросы

  • Нет связанных вопросов^_^