モックの動作を厳密に設定していない限り、セットアップの必要はありません。あなたは削除から何も返していません。Verify の呼び出しで十分です。
コードから完全には明らかでないものもあります。
リポジトリは製品を削除しますが、コントローラーはproductviewmodelsを破棄します。
Moq 4 では、次の場合にテストが機能するはずです。
- _products のすべての製品の製品ビュー モデルがあります。
- Controller.Destroy メソッドは、_products と同じ順序でビューモデルから製品を取得します。
_productViewModels が _products と 1:1 で一致していることを確認し、Destroy() がビューモデルから製品を抽出する方法を確認してから、Delete() を呼び出します。
これらの特定の製品が他の製品ではなく削除されたことを確認したいので、IsAny>() は使用しません。
[TestClass]
public class Verifying {
public interface IProductRepository {
void Delete(IEnumerable<Product> products);
}
public class ProductController {
private IProductRepository _repository;
public ProductController(IProductRepository repository) {
_repository = repository;
}
public void Destroy(IEnumerable<Product> products) {
_repository.Delete(products);
}
public void Destroy(IEnumerable<ProductViewModel> productViewModels) {
_repository.Delete(productViewModels.Select(vm => vm.Product));
}
}
public class Product {
}
public class ProductViewModel {
public Product Product { get; set;}
}
static Verifying() {
sProducts = new List<Product> { new Product(), new Product(), new Product() };
sProductViewModels = new List<ProductViewModel>(sProducts.Select(p => new ProductViewModel { Product = p }));
}
private static List<Product> sProducts;
private static List<ProductViewModel> sProductViewModels;
private Mock<IProductRepository> _mockRepository;
private ProductController CreateController() {
_mockRepository = new Mock<IProductRepository>();
return new ProductController(_mockRepository.Object);
}
[TestMethod]
public void DestroyingProducts() {
var controller = CreateController();
controller.Destroy(sProducts);
_mockRepository.Verify(mk => mk.Delete(sProducts));
}
[TestMethod]
public void DestroyingProductViewModels() {
var controller = CreateController();
controller.Destroy(sProductViewModels);
_mockRepository.Verify(mk => mk.Delete(sProducts));
}
}