1

我最近开始向我的应用程序(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);
}

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

4

1 回答 1

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);
}

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

于 2013-08-08T15:18:43.423 回答