摘要持久性和TIBCO通信從你的類。例如。你可以使用一些倉庫接口用於與SQL服務器:
public interface IProductsRepository
{
IEnumerable<Product> GetSomeProducts();
// other members
}
而一些網關與TIBCO通信電子(我把它命名爲股票,但你應該提供企業的具體名稱):
public interface IStockGateway
{
void DoSomethingWithProducts(IEnumerable<Product> products);
// other members
}
然後使你的班級依賴於這些抽象。你將能夠嘲笑他們並驗證課堂行爲:
public class ProductDataServiceProvider
{
private IProductsRepository _productRepository;
private IStockGateway _stockGateway;
// inject implementations
public ProductDataServiceProvider(
IProductRepository productRepository,
IStockGateway stockGateway)
{
_productRepository = productRepository;
_stockGateway = stockGateway;
}
public void ProcessProductFeed()
{
// use repository and gateway
}
}
現在,回到測試。什麼是你的提供者的責任 - 從產品倉庫獲得一些產品(這個倉庫的實現將從SQL數據庫加載產品)並將它們傳遞給網關(網關的實現將把產品發佈到TIBCO)。這裏是使用Moq庫的測試:
[TestMethod]
public void ShouldPassSomeProjectToStock()
{
// Arrange
var products = new List<Product>() { }; // create some products
var mockRepository = new Mock<IProductRepository>();
mockRepository.Setup(r => r.GetSomeProducts()).Returns(products);
var mockGateway = new Mock<IStockGateway>();
mockGateway.Setup(g => g.DoSomethingWithProducts(products));
var provider = new ProductDataServiceProvider(mockRepository.Object,
ockGateway.Object);
// Act
provider.ProcessProductFeed();
// Assert
mockRepository.VerifyAll(); // verify products retrieved from repository
mockGateway.VerifyAll(); // verify products passed to gateway
}
強調應該對每個組件進行單獨測試。一勞永逸測試整個事情是非常危險的,因爲這意味着業務中的邏輯錯誤可能被其他層所掩蓋。 – Mgetz
一起測試所有組件將是一個集成測試,而不是單元測試。 – Romoku
@Romoku我知道,但人們常常忘記和不喜歡的東西[測試MOQ(http://stackoverflow.com/questions/15062403/moq-testing-void-method?rq=1) – Mgetz