我最近开始向我的应用程序(EF5、MVVM Light、.NET4.5)添加单元测试,而Effort非常适合测试模型。但我真的不知道如何用假的 DBConnection 测试 ViewModel。
我的上下文目前看起来像这样:
public partial class DataContext : DBContext
{
// Gets used by the ViewModels
public TraceContext() : base("name=DataContext") { }
// Gets used by Effort for unit testing
public TraceContext(EntityConnection connection) : base(connection, true) { }
}
在我的 ViewModel 中,它以这种方式使用(简化):
public IEnumerable<Measurement> Measurements { get { ... } set { ... } }
public void LoadData()
{
// Get data always from a fresh context on reload,
// to have most recent data from the database
using (var context = new TraceContext())
{
Measurements = context.Measurements.ToList();
}
}
现在的问题是我真的不知道应该如何使用假数据库测试上面的代码。
[Setup]
public void SetUp()
{
_viewModel = new MeasurementViewModel();
// Only uses the DataContext connection string for EF magic
// not to acctually connect to the database
var connection =
Effort.EntityConnectionFactory.CreateTransient("name=DataContext");
_context = new DataContext(connection);
// Insert test data
...
_context.SaveChanges();
}
[Test]
public void TestLoadData()
{
// Here comes the tricky part, how to tell the ViewModel
// to use the fake Context?
_viewModel.LoadData();
Assert.IsNotEmtpy(_viewModel.Measurements);
}
有没有一种很好的方法可以在不重构我的大部分代码的情况下处理这个问题?