我正在嘗試將一個遺留項目置於測試中。代碼的編寫方式通常是可測試的,但某些第三方依賴關係不是。我試圖總結我的周圍,看起來如何進行單元測試是這樣的頭:單元測試作業組件C#
class InsightEmailJob : NHibernateJob
{
public IInsightEmailService InsightEmailService { get; set; }
public IReportService ReportService { get; set; }
public ITemplatedNotifier TemplatedNotifier { get; set; }
public string ReplyEmail { get; set; }
public string ReplyName { get; set; }
public InsightEmailJob(ISession session,
ILog log,
IInsightEmailService insightEmailService,
IReportService reportService,
ITemplatedNotifier templatedNotifier,
SystemReplyEmailSpec systemReplyEmailSpec)
: base(session, log)
{
InsightEmailService = insightEmailService;
ReportService = reportService;
TemplatedNotifier = templatedNotifier;
ReplyEmail = systemReplyEmailSpec.ReplyEmail;
ReplyName = systemReplyEmailSpec.ReplyName;
}
public int AccountID{ get; set; }
private Account mAccount;
public Account Account
{
get
{
if (this.mAccount == null)
{
mAccount = this.InsightEmailService.Get<Account>(AccountID);
}
return mAccount;
}
}
protected override void DoWork(JobExecutionContext context)
{
var insightEmail = InsightEmailService.FindAndIncrementEmailForAccount(Account);
var report = ReportService.LoadMultiReportByName(insightEmail.ReportName);
var reportData = ReportService.Execute(report, new ParameterValuesDictionary(Account, DateTime.Now.AddDays(-7), DateTime.Now, 0));
var templateData = new Hashtable {{"data", reportData}, {"account", Account}};
foreach (var u in Account.Users.Where(x => x.Notify))
{
TemplatedNotifier.Send(u.UserName, ReplyName, ReplyEmail, insightEmail.TemplateName, templateData);
}
}
}
據我瞭解,很多人會建議使用嘲笑或存根在傳遞,而不是接口,但是我有點困惑,這實際上是有益的。看起來,這樣做只會確保調用適當的方法,這讓我覺得有些空洞,並且與作業的實現相關聯成爲一個非常有效的測試。最終問題就變成了,你如何單元測試不返回值的東西,而只是在沒有按照你說的方式進行測試的情況下進行測試纔會產生副作用?
嘲笑的方法一個例子,我不知道怎樣添加另一個抽象這裏是要減少複雜性。發送*的電子郵件已被抽象爲已實現接口的類,我*已*使用接口。 IInsightEmailService是加載InsightEmails的存儲庫。我可以將SystemReplyEmailSpec推入通知程序,並且這會將相關性降低到5,但我沒有看到勝利。爲什麼要把另一個類放到這個地方(即相同的東西)比使用已經存在的代碼更好? – 2013-05-01 21:21:53