У меня есть проблема, когда я настраиваю свой макет для добавления объекта. В случае, если я хочу получить объект / объект, моя макетная установка работает нормально, но когда я хочу создать (добавить). Я установил метод создания, и он вернулся ...

1
mrshk_vv 2 Мар 2021 в 12:36

1 ответ

Лучший ответ

Проблема в том, что ожидалось использовать addingProduct, конкретный экземпляр

_productMockRepo.Setup(x => x.AddProductAsync(addingProduct))
        .ReturnsAsync(addingProduct);

Но при выполнении теста он получает другой экземпляр, созданный в тестируемом члене

var result = await _sut.AddProductAsync(actualProduct);

Который я могу только предположить, делает что-то похожее на то, что было сделано здесь

var addingProduct = new Product {
    Name = actualProduct.Name,
    Price = actualProduct.Price,
    Category = actualProduct.Category,
    Quantity = actualProduct.Quantity
};

Поскольку испытуемый (например: ProductService.AddProductAsync(Product product)) не отображается.

Поскольку это не фактический экземпляр, используемый в настройке, макет по умолчанию вернет null.

В этом случае ослабьте совпадение аргументов во время настройки ожидаемого поведения.

//...

_productMockRepo
    .Setup(x => x.AddProductAsync(It.IsAny<Product>())) //<-- loosen expected match
    .ReturnsAsync((Product p) => p); //<-- return the argument that was passed to the member

//...

И измените выражение для проверки, чтобы проверить, что было пройдено

_productMockRepo.Verify(x => x.AddProductAsync(It.Is<Product>(p => addingProduct.Name == p.Name && ... )), Times.Once);

Ссылка: Краткое руководство по MOQ - подходящие аргументы

1
Nkosi 2 Мар 2021 в 10:40