如何编写单元测试来验证WCF-RIA服务的DomainService查询方法是否需要验证?

问题描述:

我正在为我们的WCF RIA服务进行单元测试,这些服务有RequiresRoleRequiresAuthentication属性附加到它们。我已经能够测试更新,插入和删除方法,以确保正确设置属性。这是通过嘲笑IServiceProvider,与该提供商和正确的DomainOperationType创建DomainServiceContext,向服务提供商添加IPrincipal服务,然后在适当的ChangeSet上运行Submit()服务。这似乎运作良好。如何编写单元测试来验证WCF-RIA服务的DomainService查询方法是否需要验证?

但是,我一直无法测试查询调用。这些通过服务上的Query()方法调用。因此,我正在做与其他人一样的准备工作(创建IServiceProvider,DomainServiceContext和和IPrincipal)并尝试创建适当的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搜索并在这里进行了广泛搜索。到目前为止,我一无所获。

我觉得有两两件事要做,当单元测试授权:

首先,检查权的规则已经被应用。你不必为此执行规则。反思会告诉你是否应用了正确的规则。这是规则以声明方式应用的事实的副产品。更具体地说,您可以使用更高级别的API以及超越反射 - DomainServiceDescription针对DomainService类型。

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

希望有所帮助。

+0

首先,感谢您的回复。我实际上刚开始做第一次测试...从此以后就没有在这里检查过。其次,我不清楚如何做第二个。作为一个例子,我应该测试一下,当IPrincipal具有正确的角色时,通过AuthorizationContext将RequiresRole应用于IPrincipal会有效吗?显然,我会测试一个自定义的授权规则,因为我认为RequiresRole确实有效:)换句话说,测试授权规则。 – 2010-07-23 14:02:38