the*_*dev 3 c# unit-testing visual-studio-2010 vs-unit-testing-framework
这是我第一次遇到单元测试,我试图理解如何在简单的日期验证中使用这个概念.
用户可以选择代表日期的ToDate,直到可以进行付款.如果我们的日期无效,则无法付款.
private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
//show a custom message
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何使用单元测试?
问候,
亚历克斯
谢谢你的回答:
正如你们许多人所建议的那样,我将拆分函数并将验证与消息显示分开,并使用单元测试.
public bool IsDateValid(DateTime toDate)
{
return (Manager.MaxToDate < toDate.Year);
}
Run Code Online (Sandbox Code Playgroud)
对的,这是可能的.但是单元测试改变了你班级的设计.要对此代码进行单元测试,您应进行以下更改:
让你的方法公开.(可以使其受到保护,但为了简单起见,请将其公开).
将此方法的所有外部依赖项提取到接口,以便您可以模拟它们.然后你可以使用一些模拟库(moq,Rhino.Mocks)来模拟真正的依赖关系并编写断言.
写测试.
这是示例代码.
被测试的课程:
public class ClassUnderTest
{
public IManager Manager {get;set;}
public IMessanger Messanger {get;set}
public ClassUnderTest (IManager manager, IMessanger messanger)
{
Manager = manager;
Messanger = messanger;
}
private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
//show a custom message
Messanger.ShowMessage('message');
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
[TestFixture]
public class Tester
{
public void MessageIsShownWhenDateIsLowerThanMaxDate()
{
//SetUp
var manager = new Mock<IManager>();
var messanger = new Mock<IMessanger>();
var maxDate = DateTime.Now;
manager.Setup(m => m.MaxToDate).Returns(maxDate);
var cut = new ClassUnderTest (manager.Object, messanger.Object);
//Act
cut.CheckToDate();
//Assert
messanger.Verify(foo => foo.ShowMessage("message"), Times.AtLeastOnce())
}
}
Run Code Online (Sandbox Code Playgroud)
通过测试引入的设计更改为您提供了良好的系统解耦.当外部依赖项未写入事件时,可以为特定类编写测试.
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |