如何对依赖于数据库的WCF存储库进行单元测试并使它们在测试后回滚?

时间:2011-11-28 09:05:20

标签: c# database unit-testing

我这里有一些代码,通过linq从sc中检索数据,这些代码被抽象为dll。呼。

所以基本上我的测试涉及在两个表中创建一些条目,我需要确保表B条目具有到表A条目的正确链接。

所以我在谷歌上搜索,我发现之前的讨论,以及看起来非常棒的方法to me was the one using transaction scope.

所以我将我的单元测试修改为:

    [Test, DataRollBack]
    public void TestCreateWarrantNumber_CreateNewWarrant_Return_NewWarrantID()
    {
    string userName = "headauth";

    using (TransactionScope scope = new TransactionScope())
    {
        IdbRepository repository = new dbRepository();
        DataServiceContext db = new DataServiceContext();

        int Id = repository.CreateProduct(Ids, userName);

        var foundId = (from w in db.Transactions
                              where w.Ref == Id.ToString()
                              select w).OrderBy(w => w.Id).FirstOrDefault();

        int foundId = 0;
        if (foundNumberId != null)
        {
            foundId = foundNumberId.Id;
        }

        Assert.AreEqual(Id, foundId,
                        "Transaction must be assigned successfully to the new product.");
    }
}

每次我在vs2010中运行此测试时,它都不起作用,我可以在我的数据库中看到每次运行此测试时都会在产品表上创建此条目。

所以我认为最简单的测试方法就是将其链接到数据库并以这种方式进行测试,但我现在需要的是每次测试完成后如何回滚?

我在这里做错了什么想法? 感谢

更新

启用DTC后,i still can't test不会将数据插入表中。和我try nunitx方法,但也无济于事(

1 个答案:

答案 0 :(得分:1)

默认情况下,事务不会通过流程边界进行扩展。您需要在服务中启用此功能,然后使用正确的绑定。

Here你可以找到一些信息。

如果您的WCF服务不支持事务并且您无法更改代码,我认为您仍然坚持使用第二个选项(直接连接到没有WCF的数据库)。然后,您的TransactionScope将包含您的数据库更改,并在您退出范围时自动回滚(因为您没有调用'Commit')