[英]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.