0

私はモッキングに不慣れですが、これは私が見逃している本当に基本的なものでなければなりません:

以下のテストコードは例外を生成します:

モックでの呼び出しが少なくとも1回は必要ですが、実行されませんでした:x => x.DeleteProducts(._ products)\ r \ n \ r \ n構成されたセットアップ:\ r \ nx => x.DeleteProducts(._ products)、Times。決して\r\ n \ r \ n実行された呼び出し:\ r \ nIProductRepository.DeleteProducts(System.Collections.Generic.List`1 [WebApiDemo.DataAccessLayer.Product])

コントローラメソッドをステップスルーすると、DeleteProductsメソッドが呼び出されているようです...

  // Arrange
  IEnumerable<Product> _products = Helpers.ProductHelpers.CreateProducts(_numberProducts);

  Mock<IProductRepository> _productRepository = new Mock<IProductRepository>();

  _productRepository.Setup(x => x.DeleteProducts(_products));

  ProductsController controller = new ProductsController(_productRepository.Object);

  // Act
  controller.Destroy(_productViewModels);  // Destroy calls DeleteProducts

  // Assert
  _productRepository.Verify(x => x.DeleteProducts(_products));
4

2 に答える 2

0

DeleteProducts(_products);void を返しますか? .Verifiable()あると思いますので、 の最後にを付ける必要があります.Setup()

Times.Never()それが整っていれば、問題なく実行できるはずですが、代わりにTimes.Once()??がある理由はわかりません。

It.IsAny<T>また、次のような特定のコレクションではなく、セットアップ呼び出しを使用することをお勧めします。

MyMock.Setup(x => x.MyMethod(It.IsAny<IEnumerable<Widget>>)).Verifiable()
于 2012-10-02T16:07:57.187 に答える
0

モックの動作を厳密に設定していない限り、セットアップの必要はありません。あなたは削除から何も返していません。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));
    }

}
于 2012-10-03T10:00:24.620 に答える