7

此刻我正在自食其力。就像实体框架不可测试。我已经阅读了很多使用工作单元或最小起订量或回购模式的帖子和线程。

我正处于一个无法改变很多应用程序架构的阶段。该应用程序此时可以完全正常工作,但要确保我需要具有高代码覆盖率,因此需要对其进行测试。

对于测试,我使用的是“假上下文”方法,我可以使用假的进行模拟,使用真的连接到数据库。

我以此为例。 http://romiller.com/2010/09/07/ef-ctp4-tips-tricks-testing-with-fake-dbcontext/

在那里,您可以看到上下文被拆分并用作接口。喜欢:

    public interface IEmployeeContext
    {
        IDbSet Department Departments { get; }
        IDbSet Employee Employees { get; }
        int SaveChanges();
    }

    public class EmployeeContext : DbContext, IEmployeeContext
    {
        public IDbSet Department Departments { get; set; }
        public IDbSet Employee Employees { get; set; }
    }

    public class FakeEmployeeContext : IEmployeeContext
    {
        public FakeEmployeeContext()
        {
            this.Departments = new FakeDepartmentSet();
            this.Employees = new FakeEmployeeSet();
        }

        public IDbSet Department Departments { get; private set; }

        public IDbSet Employee Employees { get; private set; }

        public int SaveChanges()
        { 
         return 0; 
        }
    }

    }

所以测试,一切正常。我似乎唯一不能做的事情是测试一个带有 .State 的控制器,我在其中检查它是否已更改,例如:EntityState.Modified

因为这使用了一个接口,所以我需要将它添加到接口上下文中。并创建一个新的。还是我错过了什么?在那种情况下创建整个方法可能不是我的意图。我怎样才能让它发挥作用

4

3 回答 3

4

您是否考虑过执行集成测试?

您可以针对真实的 EF DBContext 进行集成测试,只需在单元测试项目的 App.config 中为其提供不同的连接字符串。

阅读本文及其所有答案。

于 2013-05-22T18:15:55.913 回答
1

只需在上下文界面中添加属性即可。顺便说一句,您不需要 FakeContext,您只需创建接口的模拟,并设置属性以返回您的假数据集。这样,您可以根据需要在界面中添加/删除任意数量的方法和属性。

于 2013-05-22T17:56:00.603 回答
1

感谢@Liel,我设法完成了这项工作。为集成测试创建一个“测试”数据库。在我看来,而不是使用不必要的代码。通过使用这种方法,我的项目现在完全独立了。

[TestInitialize]
public void InitializBeforeTests()
{
    AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ""));
    Database.SetInitializer<DataAccess.DataContext>(new DropCreateDatabaseAlways<DataAccess.DataContext>());
    var context = new DataAccess.DataContext();
    context.Database.Initialize(force: true);
}

并在我的测试项目中的 APP.Config 中创建一个新的连接字符串。

谢谢大家的回答!

于 2013-05-23T08:28:28.087 回答