Использование отражения для загрузки MemberData в тесте XUnit - PullRequest
1 голос
/ 10 июня 2019

Сценарий: У меня есть два перечисления, одно с именем Area, а другое с именем Permission, они используются для настройки рабочего разрешения.Я перебираю их и в конечном итоге получаю политики с именем, структурированным как AreaPermission.Затем у меня есть отдельный класс, полный строковых констант, которые используются в атрибуте auth на контроллере [Authorize(Policy = MyClass.PolicyName)]

Желаемый результат: Мне нужен модульный тест, который проходит через все свойствакласс констант, и вызывает метод, который получает все имена политик для политики авторизации DI службы регистрации.Так что в будущем, если разработчик добавит значение разрешения или значение области, тогда будет проведен модульный тест, если строковая константа не была создана.

Текущий результат: Я в настоящее времяполучение результата без данных:

System.InvalidOperationException : No data found for OperationPoliciesTest.PoliciesExistInRegistrationMethod
  Exception doesn't have a stacktrace

Класс TestData:

public class OperationalPoliciesTestData  : IEnumerable<object[]>
    {
        public IEnumerator<object[]> GetEnumerator()
        {
            var t = typeof(OperationPolicies);
            var props = t.GetProperties();

            foreach (var prop in props)
            {
                yield return new object[] {prop.Name};
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

Класс теста:

public class OperationPoliciesTest
    {
        private readonly List<string> _registeredPolicies;

        public OperationPoliciesTest()
        {
            var policies =
                OperationalRequirementRegister.GetAllOperationalPolicyNames();

            _registeredPolicies = new List<string>(policies.Keys);
        }


        [Theory]
        [ClassData(typeof(OperationalPoliciesTestData))]
        public void PoliciesExistInRegistrationMethod(string policyName)
        {
            Assert.NotEmpty(_registeredPolicies);
            Assert.NotNull(policyName);
            Assert.Contains(policyName, _registeredPolicies);
        }
    }

Есть предложения о том, что я что-то упустил?

...