使用EntityFramework对MVVM进行单元测试

本文关键字:单元测试 MVVM EntityFramework 使用 | 更新日期: 2023-09-27 18:26:57

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

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

使用EntityFramework对MVVM进行单元测试

一个简单的方法是重载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);
}

一个更好的方法是用工厂的方法或工厂。。。