如何创建在asp.net中将记录更新到数据库的单元测试

时间:2010-05-13 08:58:58

标签: asp.net unit-testing

如何创建在asp.net中将记录更新到数据库的单元测试

1 个答案:

答案 0 :(得分:1)

虽然从技术上讲我们并不称之为“单元测试”,而是“集成测试”(正如Oded所解释的),您可以通过使用单元测试框架(如MSTest)来实现这一点(Visual Studio 2008/2010的一部分)专业)或其中一个免费的单元测试框架,如NUnit。

但是,测试ASP.NET Web项目通常非常困难,尤其是当您将所有逻辑放在网页中时。最好的办法是将所有业务逻辑提取到一个单独的层(通常是解决方案中的单独项目),并从您的网页中调用该逻辑。但也许你已经有了这种分离,这将很棒。

这样您也可以在测试中调用此逻辑。对于集成测试,最好有一个单独的测试数据库。测试数据库必须包含已知(且稳定)的数据集(或完全为空)。不要使用生产数据库的副本,因为当数据更改时,您的测试可能会突然失败。此外,您应该确保应该回滚由集成测试进行的数据库中的所有更改。否则,测试数据库中的数据会不断变化,这可能会导致测试突然失败。

我总是在集成测试中使用TransactionScope(从不在我的生产代码中)。这可确保回滚所有数据。下面是使用MSTest时这样的集成测试的示例:

[TestClass]
public class CustomerMovedCommandTests
{
    // This test test whether the Execute method of the
    // CustomerMovedCommand class in the business layer
    // does the expected changes in the database.
    [TestMethod]
    public void Execute_WithValidAddress_Succeeds()
    {
        using (new TransactionScope())
        {
            // Arrange
            int custId = 100;

            using (var db = new ContextFactory.CreateContext())
            {
                // Insert customer 100 into test database.
                db.Customers.InsertOnSubmit(new Customer()
                {
                    Id = custId, City = "London", Country = "UK"
                });

                db.SubmitChanges();
            }                

            string expectedCity = "New York";
            string expectedCountry = "USA";

            var command = new CustomerMovedCommand();
            command.CustomerId = custId;
            command.NewAddress = new Address()
            {
                City = expectedCity, Country = expectedCountry
            };

            // Act
            command.Execute();

            // Assert
            using (var db = new ContextFactory.CreateContext())
            {
                var c = db.Customers.Single(c => c.Id == custId);

                Assert.AreEqual(expectedCity, c.City);
                Assert.AreEqual(expectedCountry, c.Country);
            }
        } // Dispose rolls back everything.
    }
}

我希望这会有所帮助,但下次请在您的问题中更具体一点。