Я играю с инфраструктурой тестирования на основе свойств FsCheck, интегрированной с XUnit, C #. Мой тест имеет два входа, которые я хотел бы сгенерировать и снабдить платформой. Я хотел бы, чтобы эти два набора были связаны таким образом, чтобы:
- первый набор представлял собой набор целых чисел с простым ограничением,
- второй набор не должен содержать никаких значений из первогоset.
Как я могу определить такое отношение?
Фрагмент ниже показывает, как я пытаюсь реализовать тест. Моим лучшим предположением будет то, что мне нужно каким-то образом определить фильтр для inputDataGen
, но я не знаю, как это сделать, поскольку это не материализованное значение.
Надеюсь, кто-нибудь сможет пролить на него свет?
Спасибо, Артур
public class RelatedInputDataTest
{
[Fact]
public Property WhenAllValuesFromInputAlreadyExist_ReturnsTrue()
{
var inputDataGen = Arb.Default.Int32().Generator.Where(x => x > 50).ListOf();
var alreadyExistingValuesGen = Arb.Default.Int32().Generator
.Where(value =>
{
// How to state that value must not be contained within list generated by inputDataGen?
// Something like: return inputDataGen.Contains(value) == false;
return true;
})
.ListOf();
return Prop.ForAll(
inputDataGen.ToArbitrary(),
alreadyExistingValuesGen.ToArbitrary(),
(inputData, alreadyExistingValues) =>
{
var sut = new MyCustomSet(alreadyExistingValues);
var isUnique = sut.IsUnique(inputData);
return isUnique;
});
}
}
public class MyCustomSet
{
private readonly IList<int> _data;
public MyCustomSet(IEnumerable<int> initialData)
{
_data = new List<int>(initialData);
}
public bool IsUnique(IEnumerable<int> values)
{
return values.All(x => _data.Contains(x)) == false;
}
}