代码地址:http://git.oschina.net/zhv/UnitTest
对象和属性的对比
被测代码
public class LogAnalyzer3
{
private ILogger _logger;
private IWebService _webService;
public LogAnalyzer3(ILogger logger,IWebService webService)
{
_logger = logger;
_webService = webService;
}
public int MinNameLength { get; set; }
public void Analyze(string filename)
{
if (filename.Length<MinNameLength)
{
try
{
_logger.LogError(string.Format("Filename too short: {0}",filename));
}
catch (Exception e)
{
_webService.Write(new ErrorInfo(1000, e.Message));
}
}
}
}
为了对比对象,需要实现Equals的重写
public class ErrorInfo
{
private readonly int _severity;
private readonly string _message;
public ErrorInfo(int severity, string message)
{
_severity = severity;
_message = message;
}
public int Severity
{
get { return _severity; }
}
public string Message
{
get { return _message; }
}
protected bool Equals(ErrorInfo other)
{
return _severity == other._severity && string.Equals(_message, other._message);
}
//this is needed to make this test pass:
// Analyze_LoggerThrows_CallsWebServiceWithNSubObjectCompare
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ErrorInfo) obj);
}
}
测试带有属性的对象
//测试带有属性的对象
//在调用WebService.Write方法时,使用了一个带有severity和message属性的ErrorInfo对象。
[Test]
public void Analyze_LoggerThrows_CallsWebServiceWithNSubObject()
{
//1. 创建伪对象
var mockWebService = Substitute.For<IWebService>();
var stubLogger = Substitute.For<ILogger>();
//2. 对桩做设置
stubLogger.When(logger => logger.LogError(Arg.Any<string>()))
.Do(info => { throw new Exception("fake exception"); });
//3. 给被测方法注入桩和模拟对象
var analyzer = new LogAnalyzer3(stubLogger, mockWebService);
analyzer.MinNameLength = 8;
analyzer.Analyze("short.txt");
//4. 对模拟对象进行检查
//使用and操作符创建比较复杂的预期结果,这里就是和检查单个值不一样的地方
mockWebService.Received().Write(Arg.Is<ErrorInfo>(info =>
info.Severity == 1000 && info.Message.Contains("fake exception")));
}
比较整个对象
//对整个对象做比较
//在上一章就没比较成功,因为需要重写objects.Equals()方法
[Test]
public void Analyze_LoggerThrows_CallsWebServiceWithNSubObjectCompare()
{
var mockWebService = Substitute.For<IWebService>();
var stubLogger = Substitute.For<ILogger>();
stubLogger.When(logger => logger.LogError(Arg.Any<string>()))
.Do(info => { throw new Exception("fake exception"); });
var analyzer = new LogAnalyzer3(stubLogger, mockWebService);
analyzer.MinNameLength = 10;
analyzer.Analyze("test.txt");
//直接比较对象有个问题是一般会返回false,必须实现Equals()方法才能正确比较
var expected = new ErrorInfo(1000, "fake exception");
//这里断言是否得到了同样的对象(expected),本质上用的就是assert.equals()
mockWebService.Received().Write(expected);
}