无效方法的MS检验

时间:2013-08-01 12:09:35

标签: c# sql unit-testing mstest

我有一个 void 方法,我需要进行单元测试,有人可以帮我怎么做

[TestMethod()]
public void ProcessProductFeedTest()
{
    // TODO: Initialize to an appropriate value
    ProductDataServiceProvider target = new ProductDataServiceProvider();

    target.ProcessProductFeed();
    Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

在上面的代码中ProcessProductFeed()是一个void方法,它从SQL Server DB获取一些数据并发布到TIBCO,我该如何编写相同的单元测试用例

2 个答案:

答案 0 :(得分:3)

好吧,你应该测试一下数据是否已经发布到TIBCO。

对于任何方法,如果主要目的是计算某些东西,或者如果这是该方法的主要目的,则测试应该测试返回的值是否正确。 (当然,您也可以测试错误条件。)

如果不了解TIBCO或您的架构,我无法评论您如何测试发布部分。我个人将阅读,处理和发布的三个阶段分开 - 然后每个部分都可以独立于其他部分进行测试。

答案 1 :(得分:3)

来自您班级的抽象持久性和TIBCO通信。例如。您可以使用某些存储库接口与SQL Server进行通信:

public interface IProductsRepository
{
    IEnumerable<Product> GetSomeProducts();
    // other members
}

与TIBCO进行通信的一些网关(我将其命名为Stock,但您应该提供特定于业务的名称):

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
}