如何创建在asp.net中将记录更新到数据库的单元测试
答案 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.
}
}
我希望这会有所帮助,但下次请在您的问题中更具体一点。