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

Я выполняю модульное тестирование для наших служб RIA WCF, к которым прикреплены атрибуты 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 и искал здесь широко. У меня пока ничего нет.

1 Ответ

1 голос
/ 23 июня 2010

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

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

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

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

...