Как ограничить один входной набор на основе другого набора - PullRequest
0 голосов
/ 29 сентября 2019

Я играю с инфраструктурой тестирования на основе свойств 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;
    }
}
...