簡體   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