Asp.net Nunit和web应用程序
我开始用“(NUnit)”学习单元测试。我知道这种类型的测试用于测试“类”、“函数”和“这些函数之间的交互” 在我的例子中,我开发“asp.net web应用程序”Asp.net Nunit和web应用程序,asp.net,unit-testing,testing,nunit,database-connection,Asp.net,Unit Testing,Testing,Nunit,Database Connection,我开始用“(NUnit)”学习单元测试。我知道这种类型的测试用于测试“类”、“函数”和“这些函数之间的交互” 在我的例子中,我开发“asp.net web应用程序” 我如何使用此测试来测试我的 页面(因为它被视为一个类) 以及在中使用的方法)和在哪个顺序?中,我有三层: 接口层(每页的.cs) 数据访问层(每个实体的类别)(DAL) 数据库层(包含到数据库的连接、打开连接、关闭连接等) 业务层(有时进行计算或某些单独的逻辑) 如何测试连接到数据库的方法 如何确保我的测试不浪费时间 有单元测试
- 我如何使用此测试来测试我的 页面(因为它被视为一个类) 以及在中使用的方法)和在哪个顺序?中,我有三层:
- 接口层(每页的.cs)
- 数据访问层(每个实体的类别)(DAL)
- 数据库层(包含到数据库的连接、打开连接、关闭连接等)
- 业务层(有时进行计算或某些单独的逻辑)
- 如何测试连接到数据库的方法
- 如何确保我的测试不浪费时间
public class NotTestableParty
{
public bool ShouldStartPreparing()
{
if (DateTime.Now.Date == new DateTime(2011, 12, 31))
{
Console.WriteLine("Prepare for party!");
return true;
}
Console.WriteLine("Party is not today");
return false;
}
}
你将如何测试这个班在除夕夜做了它应该做的事情?你必须在除夕夜做:)
现在看看修改后的Party类
存根示例:
public class Party
{
private IClock clock;
public Party(IClock clock)
{
this.clock = clock;
}
public bool ShouldStartPreparing()
{
if (clock.IsNewYearsEve())
{
Console.WriteLine("Prepare for party!");
return true;
}
Console.WriteLine("Party is not today");
return false;
}
}
public interface IClock
{
bool IsNewYearsEve();
}
public class AlwaysNewYearsEveClock : IClock
{
public bool IsNewYearsEve()
{
return true;
}
}
现在在测试中,你可以把假时钟传给聚会课
var party = new Party(new AlwaysNewYearsEveClock());
Assert.That(party.ShouldStartPreparing(), Is.True);
现在你知道你的派对课是不是在除夕夜上课了。AlwaysNewearseveclock是一个存根
现在看看这个类:
public class UntestableCalculator
{
private Logger log = new Logger();
public decimal Divide(decimal x, decimal y)
{
if (y == 0m)
{
log.Log("Don't divide by 0");
}
return x / y;
}
}
public class Logger
{
public void Log(string message)
{
// .. do some logging
}
}
您将如何测试您的类记录消息。根据您的日志位置,您必须检查文件、数据库或其他位置。这不是单元测试,而是集成测试。为了进行单元测试,您需要这样做
public class TestableCalculator
{
private ILogger log;
public TestableCalculator(ILogger logger)
{
log = logger;
}
public decimal Divide(decimal x, decimal y)
{
if (y == 0m)
{
log.Log("Don't divide by 0");
}
return x / y;
}
}
public interface ILogger
{
void Log(string message);
}
public class FakeLogger : ILogger
{
public string LastLoggedMessage;
public void Log(string message)
{
LastLoggedMessage = message;
}
}
在测试中你可以
var logger = new FakeLogger();
var calculator = new TestableCalculator(logger);
try
{
calculator.Divide(10, 0);
}
catch (DivideByZeroException ex)
{
Assert.That(logger.LastLoggedMessage, Is.EqualTo("Don't divide by 0"));
}
在这里,你断言伪造的日志。假记录器是模拟对象。非常感谢Peri,有些概念还不清楚,你能解释一下你所说的
测试双精度(
)、存根(
)、模拟(
)、SUT(
)是什么意思吗。“我真的不知道这与第2点有什么不同。”数据库层直接使用数据库,数据访问层由每个实体(映射)的类组成,并使用数据库层访问数据和执行CRUD操作。