Как следует написать модульный тест для проверки того, что метод запроса WCF-RIA Services DomainService требует аутентификации?

Я выполняю модульное тестирование для наших служб WCF RIA, к которым прикреплены атрибуты RequiresRole или RequiresAuthentication. Мне удалось протестировать методы Update, Insert и Delete, чтобы убедиться, что атрибуты установлены правильно. Это делается путем имитации IServiceProvider, создания DomainServiceContext с этим провайдером и правильным DomainOperationType, добавления службы IPrincipal к поставщику услуг, а затем запуска Submit() в службе с соответствующим ChangeSet. Кажется, это работает хорошо.

Однако мне не удалось протестировать вызовы Query. Они вызываются через метод Query() службы. Итак, я выполняю ту же подготовительную работу, что и с остальными (создание IServiceProvider, DomainServiceContext и IPrincipal), и пытаюсь создать соответствующие DomainOperationEntry и QueryDescription для передачи в Query(). К сожалению, мне пока не повезло с этим. Соответствующий код:

string operationName = "GetUsers";
DomainServiceContext domainServiceContext = GetDomainServiceContext(
    authenticate: false,
    operationType: DomainOperationType.Query);
DomainOperationQuery operationQuery = mocks.DynamicMock<DomainOperationEntry>(
    typeof(UserService), operationName, DomainOperation.Query,
    typeof(IQueryable<User>), new List<DomainOperationParameter>(),
    new AttributeCollection());
mocks.ReplayAll();

service.Initialize(domainServiceContext);

int totalCount;
IEnumerable<ValidationResult> validationErrors;
QueryDescription = new QueryDescription(operationEntry);

service.Query(queryDescription, out ValidatoinErrors, out TotalCount);

Это должно вызвать UnauthorizedAccessException, когда RequiresAuthentication установлено в запросе GetUsers. Однако я ничего не получаю, независимо от того, установлен ли атрибут. Используя отладчик с точкой останова, установленной для метода GetUsers, я вижу, что этот метод никогда не вызывается. Думаю, я ошибся с operationName. Но я не знаю, проблема ли это, или, если это так, что я должен изменить его на.

Есть ли у кого-нибудь понимание этого? Я искал все в MSDN, выполнял поиск в Google и много искал здесь. У меня пока ничего нет.


person Michael Johnson    schedule 16.06.2010    source источник


Ответы (1)


Я думаю, что при авторизации модульного тестирования нужно сделать две вещи:

Во-первых, убедитесь, что были применены правильные правила. Вам не нужно выполнять правило для этого. Отражение сообщает вам, было ли применено правильное правило. Это побочный продукт того факта, что правила применяются декларативно. В частности, вы должны использовать API более высокого уровня, помимо отражения, — DomainServiceDescription для типа DomainService.

Затем проверьте, делает ли правило то, для чего оно предназначено. Для этого создайте фиктивную реализацию IPrincipal и AuthorizationContext и вызовите метод IsAuthorized атрибута AuthorizationAttribute (где каждый атрибут соответствует правилу, которое вы хотите протестировать).

Надеюсь, это поможет.

person Nikhil Kothari    schedule 23.06.2010
comment
Во-первых, спасибо за ответ. На самом деле я начал делать первый тест некоторое время назад ... просто с тех пор не проверял здесь. Во-вторых, я не совсем понимаю, как сделать второе. Я должен проверить, что, например, RequiresRole, применяемый к IPrincipal через AuthorizationContext, работает, когда IPrincipal имеет правильную роль? Очевидно, я бы протестировал пользовательское правило авторизации, потому что предполагаю, что RequiresRole работает правильно :) Другими словами, протестировал бы правило авторизации. - person Michael Johnson; 23.07.2010