使用EntityFramework对MVVM进行单元测试

时间:2013-08-08 14:53:07

标签: c# .net wpf entity-framework unit-testing

我最近开始在我的应用程序中添加单元测试(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);
}

有没有一种好方法可以在不重构我的大部分代码的情况下处理这个问题?

1 个答案:

答案 0 :(得分:0)

一种简单的方法是重载LoadData:

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())
    {
        LoadData(context);
    }
}

public void LoadData(TraceContext context)
{
    Measurements = context.Measurements.ToList();
}

在您的测试中,您可以使用伪上下文调用LoadData:

[Test]
public void TestLoadData()
{
    _viewModel.LoadData(_context);
    Assert.IsNotEmtpy(_viewModel.Measurements);
}

更好的方法是使用工厂方法或工厂......