1 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個贊
我想你已經(jīng)找到了快樂路徑場景,測試在沒有例外的情況下會發(fā)生什么。但是現(xiàn)在您需要測試不愉快的路徑,當(dāng)拋出異常時它的行為是否正確。
//arrange
var mockRepo = new Mock<DocumentRepository>(MockBehavior.Strict);
mockRepo.Setup(r => r.DeleteDocument(It.IsAny<PortalDocument>())).Throws(new Exception("test"));
var controller = new DocumentController(mockRepo.Object);
//act
var result = controller.Delete("filename", true);
//assert
//make sure result is a redirect result
//but how do I test that it got logged?
不幸的是,您會發(fā)現(xiàn)您實(shí)際上無法測試您是否記錄了某些內(nèi)容。為什么?因?yàn)槟阌幸粋€靜態(tài)方法調(diào)用。靜態(tài)方法調(diào)用不可測試。相反,您應(yīng)該遵循依賴倒置原則。
解決此問題的一種方法是用可注入的東西包裝您的日志記錄調(diào)用。
public interface ILogger
{
void LogCritical(Exception exception);
}
public class EventLogLogger : ILogger
{
public void LogCritical(Exception exception)
{
EventLog.Logger.LogCritical(exception, exception.Message);
}
}
然后你的單元測試變成:
//arrange
var mockRepo = new Mock<IDocumentRepository>(MockBehavior.Strict);
mockRepo.Setup(r => r.DeleteDocument(It.IsAny<PortalDocument>())).Throws(new Exception("test"));
var mockLogger = new Mock<ILogger>(MockBehavior.Strict);
mockLogger.Setup(l => l.LogCritical(It.IsAny<Exception>())).Verifiable;
var controller = new DocumentController(mockRepo.Object, mockLogger.Object);
//act
var result = controller.Delete("filename", true);
//assert
//make sure result is a redirect result
mockLogger.Verify();
請注意,我在示例中使用了Moq 庫語法。您需要根據(jù)您的模擬框架進(jìn)行調(diào)整。
如果您不熟悉依賴注入,我強(qiáng)烈建議您觀看Miguel Castro 的 Deep Dive Into Dependency Injection 和 Writing Quality Decoupled Code。
- 1 回答
- 0 關(guān)注
- 253 瀏覽
添加回答
舉報