2016-12-27 60 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