2016-12-27 49 views
1

我正在使用JustMock和實體框架來嘗試爲服務編寫單元測試。在服務上,我有這樣的方法:在另一個類中用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仍然可以執行集成測試,但在這種情況下,你需要創建測試數據庫並設置連接字符串指向DB在測試項目的app.config。 – kat1330

相關問題