如何编写单元测试以验证WCF-RIA Services DomainService查询方法是否需要身份验证?

时间:2010-06-16 23:20:57

标签: .net unit-testing wcf-ria-services

我正在为我们的WCF RIA服务进行单元测试,这些服务附加了RequiresRoleRequiresAuthentication个属性。我已经能够测试Update,Insert和Delete方法以确保正确设置属性。这是通过模拟IServiceProvider,使用该提供商和正确的DomainServiceContext创建DomainOperationType,向服务提供商添加IPrincipal服务然后运行Submit()来完成的。在具有适当ChangeSet的服务上。这似乎运作良好。

但是,我无法测试Query调用。这些是通过服务上的Query()方法调用的。所以我正在做与其他人一样的准备工作(创建IServiceProviderDomainServiceContextIPrincipal)并尝试创建合适的DomainOperationEntryQueryDescription传递给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 个答案:

答案 0 :(得分:1)

我认为在单元测试授权时有两件事要做:

首先,检查是否已应用正确的规则。您不必为此执行规则。反射告诉您是否已应用正确的规则。这是规则应用规则这一事实的副产品。更具体地说,您将使用更高级别的API,而不仅仅是针对DomainService类型的DomainServiceDescription。

接下来,测试规则会执行它应该执行的操作。为此创建一个IPrincipal和AuthorizationContext的模拟实现,并调用AuthorizationAttribute的IsAuthorized方法(其中每个属性对应于您要进行单元测试的规则)。

希望有所帮助。