6

我们有一个疯狂的数据驱动应用程序。我们希望对应用程序进行单元测试,但由于数据量大,开发人员不愿意构建完全虚假的存储库。我真的不怪他们。

了解我们正在将测试改进到现有应用程序中。如果我们重新开始,我们将进行大量架构更改,以促进使用假存储库进行更好的单元测试。

我们想将一个已知的 mdf 文件与测试一起分发,复制它,并使用它来执行我们的测试。是否有经过批准的技术?我熟悉将资源嵌入到测试 dll 中,但不熟悉嵌入 mdf——如果可以做到的话。


一个解决方案(有点):

我最终从 Andrew Tokeley 关于模拟 Linq 数据上下文的帖子中获取了 DataContextWrapper(http://andrewtokeley.net/archive/2008/07/06/mocking-linq-to-sql-datacontext.aspx)并创建了一个 FakeDataContext.cs那基本上是一堆列表。

我写了一个真正野蛮的 T4 模板(想想“select * FROM <#=table.BaseClass.QualifiedName#>”)来从已知良好的数据库中复制数据,以创建一个包含以下内容的巨大类:

List<Customer> _customers = new List<Customer>();
_customers.Add(new Customer(){CustomerId = 1, CustomerName = "ACME"});

等等

该类是 25K 行,但由于 t4 写了所有这些行,谁在乎呢?它允许我们只模拟数据上下文,因此我们可以针对假上下文测试我们的 linq,并合理地保证我们得到了正确的查询。最初的开发人员在 repo 中放置了大量的业务逻辑,因此它允许我们针对已知的良好数据测试逻辑。

4

2 回答 2

5

您可以在共享服务器上设置测试数据库,这样您就不必部署 mdf 文件了吗?

另外,你能用 TransactionScope 包装所有单元测试吗?

我在我的公司中使用了一个测试数据库,其中包含所有测试的众所周知的参考数据,并为集成测试创建了一个基类,如下所示:

[TestClass]
public class ServiceTest
{
    private TransactionScope Transaction { get; set; }

    [TestInitialize]
    public virtual void TestInitialize()
    {
        Transaction = new TransactionScope();
    }

    [TestCleanup]
    public virtual void TestCleanup()
    {
        Transaction.Dispose();
    }
}

每个测试都会回滚它的所有更改,因此测试数据污染数据库没有问题。

于 2010-12-15T15:31:40.567 回答
0

你看过模拟框架吗?如果您的代码以可以将数据依赖项注入到您正在单元测试的对象中的方式编写,那么您应该能够模拟这些数据依赖项。

我在 Moq 方面取得了巨大的成功,但后来我从一开始就使用依赖注入编写了我的代码。

于 2010-12-15T16:30:07.017 回答