[英]Moq and setup not returning values
I have this test: 我有这个测试:
[Test]
public async Task ShouldSortOnAllFormulas()
{
// Assemble
const string categoryId = "cameras";
const string organisationId = "piiick";
var services = PickContext.GivenServices();
var pickProvider = services.WhenCreatePickProvider();
var products = new List<JObject>
{
JObject.Parse("{ \"gtin\": \"1\", \"action\": \"No\", \"size\": \"Large\", \"variant\": \"1\" }"),
JObject.Parse("{ \"gtin\": \"2\", \"action\": \"No\", \"size\": \"Small\", \"variant\": \"1\" }"),
JObject.Parse("{ \"gtin\": \"3\", \"action\": \"No\", \"size\": \"Small (No Lens)\", \"variant\": \"1\" }")
};
var formulas = new List<AnswerFormula>
{
new AnswerFormula { Expression = "No", Field = "action", Operator = "=", AnswerId = 170, Filter = true },
new AnswerFormula { Expression = "Small", Field = "size", Operator = "%", AnswerId = 170, Filter = true },
new AnswerFormula { Expression = "Small", Field = "size", Operator = "%", AnswerId = 171 }
};
services.MockProductProvider.Setup(x => x.ListAvailableMasterProductsAsync(categoryId, organisationId)).ReturnsAsync(products);
services.MockFilterProvider.Setup(x => x.Filter(products, formulas)).Returns(products);
// Act
var uniqueAnswerIds = formulas.Select(m => m.AnswerId).GroupBy(m => m).Select(m => m.First()).ToList();
await pickProvider.ProcessProductsAsync(formulas, categoryId, organisationId);
// Assert
services.MockSortProvider.Verify(x => x.SortAsync(categoryId, products, uniqueAnswerIds));
}
This test fails, but it fails because products is null. 该测试失败,但是由于产品为空而失败。 The setup, for some reason, is not returning the product list.
由于某种原因,安装程序未返回产品列表。
In reality, the methods return a new list of products, but I was hoping the setup would be fine like that. 实际上,这些方法会返回新的产品列表,但我希望这样的设置会很好。 I have changed the setup to this:
我将设置更改为此:
services.MockProductProvider.Setup(x => x.ListAvailableMasterProductsAsync(categoryId, organisationId)).ReturnsAsync(products.ToList());
services.MockFilterProvider.Setup(x => x.Filter(products, formulas)).Returns(products.ToList());
So they are creating a new product list for each setup, but in my method, the product list is null. 因此,他们正在为每种设置创建一个新的产品列表,但是在我的方法中,产品列表为null。 Does anyone know why?
有人知道为什么吗?
This is the method I am testing: 这是我正在测试的方法:
public async Task<IEnumerable<JObject>> ProcessProductsAsync(IEnumerable<AnswerFormula> formulas, string categoryId, string oranisationId)
{
if (formulas == null) throw new ArgumentNullException(nameof(formulas));
var listOfFormulas = formulas.Where(m => m.Filter).ToList();
var answerIds = formulas.Select(m => m.AnswerId).GroupBy(m => m).Select(m => m.First()).ToList(); // Use all formulas, not just filtered
var products = await _productProvider.ListAvailableMasterProductsAsync(categoryId, oranisationId);
_scoreProvider.Value.Score(products, listOfFormulas); // Score
var filteredProducts = _filterProvider.Filter(products, listOfFormulas); // Filter
var sortedProducts = await _sortProvider.Value.SortAsync(categoryId, filteredProducts, answerIds); // Sort
_filterProvider.RemoveVariants(sortedProducts); // Remove duplicates
return sortedProducts;
}
I tried a number of variations and it wasn't the products that were causing the issue. 我尝试了多种变体,并不是导致问题的产品。 It was the formulas.
这是公式。 Not sure why, but changing my test to this:
不知道为什么,但是将我的测试更改为:
[Test]
public async Task ShouldSortOnAllFormulas()
{
// Assemble
const string categoryId = "cameras";
const string organisationId = "piiick";
var services = PickContext.GivenServices();
var pickProvider = services.WhenCreatePickProvider();
var products = new List<JObject>
{
JObject.Parse("{ \"gtin\": \"1\", \"action\": \"No\", \"size\": \"Large\", \"variant\": \"1\" }"),
JObject.Parse("{ \"gtin\": \"2\", \"action\": \"No\", \"size\": \"Small\", \"variant\": \"1\" }"),
JObject.Parse("{ \"gtin\": \"3\", \"action\": \"No\", \"size\": \"Small (No Lens)\", \"variant\": \"1\" }")
};
var formulas = new List<AnswerFormula>
{
new AnswerFormula { Expression = "No", Field = "action", Operator = "=", AnswerId = 170, Filter = true },
new AnswerFormula { Expression = "Small", Field = "size", Operator = "%", AnswerId = 170, Filter = true },
new AnswerFormula { Expression = "Small", Field = "size", Operator = "%", AnswerId = 171 }
};
services.MockProductProvider.Setup(x => x.ListAvailableMasterProductsAsync(categoryId, organisationId)).ReturnsAsync(products);
services.MockFilterProvider.Setup(x => x.Filter(products, It.IsAny<List<AnswerFormula>>())).Returns(products);
// Act
var uniqueAnswerIds = formulas.Select(m => m.AnswerId).GroupBy(m => m).Select(m => m.First()).ToList();
await pickProvider.ProcessProductsAsync(formulas, categoryId, organisationId);
// Assert
services.MockSortProvider.Verify(x => x.SortAsync(categoryId, products, uniqueAnswerIds));
}
Works fine. 工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.