繁体   English   中英

Moq测试是否在返回void的方法中更改了属性

[英]Moq test if an attribute was changed in a method that returns void

我想知道是否有可能使用Moq进行测试,如果对象中的某些属性已通过某种方法更改,则该方法必须为空。

我想检查产品的属性“ FlgActive”是否从true更改为false。

delete方法是无效的,它只是将该标志更改为false。

如果可能的话,我应该添加到我的设置中进行检查吗?

例:

测试

[TestMethod]
    public void DeletedProductFlagShouldBeFalse() //RN03
    {
        var product = new Product() { Id = 1, Name = "aaaaaa", Code = "aaaaaa", FlgActive = true };
        var so = new ServiceOrder() {  };

        var mockProductRepository = new Mock<IProductRepository>();
        mockProductRepository.Setup(p => p.Delete(product));

        var mockServiceOrderRepository = new Mock<IServiceOrderRepository>();
        mockServiceOrderRepository.Setup(o => o.GetProductById(product.Id)).Returns(new List<ServiceOrder> { so });

        var service = new ProductService(mockProductRepository.Object, mockServiceOrderRepository.Object);

        service.Delete(product);

        mockProductRepository.Verify(c => c.Delete(It.IsAny<Product>()), Times.Once());
        mockProductRepository.Verify((s => s.Commit()), Times.Once());

        Assert.IsFalse(product.FlgActive);
    }

服务

public void Delete(Product product)
    {
        Validate(product);
        repo.Delete(product);
        repo.Commit();
    }

仓库

public void Delete(Product product)
    {
        try
        {
            product.FlgActive = false;
            Update(product);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }
    }

将标志设置为false的不是您的服务,因此您不应从服务中测试该行为。 这个部门的工作是验证产品,然后将删除委托给存储库。

因此,您可以从测试中删除该部分并将其重命名:

[TestMethod]
public void DeletionShouldBeSentToRepository() //RN03
{
    var product = new Product() { Id = 1, Name = "aaaaaa", Code = "aaaaaa", FlgActive = true };
    var so = new ServiceOrder() {  };

    var mockProductRepository = new Mock<IProductRepository>();
    mockProductRepository.Setup(p => p.Delete(product));

    var mockServiceOrderRepository = new Mock<IServiceOrderRepository>();
    mockServiceOrderRepository.Setup(o => o.GetProductById(product.Id)).Returns(new List<ServiceOrder> { so });

    var service = new ProductService(mockProductRepository.Object, mockServiceOrderRepository.Object);

    service.Delete(product);

    mockProductRepository.Verify(c => c.Delete(product), Times.Once());
    mockProductRepository.Verify((s => s.Commit()), Times.Once());
}

注意 :我很好地确认我们正在将优质产品发送到仓库。 我已经用您It.IsAny创建的产品替换了It.IsAny

现在我们已经涵盖了您的服务职责,我们可以将删除行为测试到存储库本身中,如下所示:

[TestMethod]
public void DeletedProductFlagShouldBeFalse() //RN03
{
    var product = new Product() { Id = 1, Name = "aaaaaa", Code = "aaaaaa", FlgActive = true };

    IProductRepository repository = new ProductRepository();

    repository.Delete(product);

    Assert.IsFalse(product.FlgActive);
}

在进行单元测试时,仅测试当前类的行为而不是副作用非常重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM