如何编写单元测试来验证WCF-RIA服务的DomainService查询方法是否需要验证?
我正在为我们的WCF RIA服务进行单元测试,这些服务有RequiresRole
或RequiresAuthentication
属性附加到它们。我已经能够测试更新,插入和删除方法,以确保正确设置属性。这是通过嘲笑IServiceProvider
,与该提供商和正确的DomainOperationType
创建DomainServiceContext
,向服务提供商添加IPrincipal
服务,然后在适当的ChangeSet
上运行Submit()
服务。这似乎运作良好。如何编写单元测试来验证WCF-RIA服务的DomainService查询方法是否需要验证?
但是,我一直无法测试查询调用。这些通过服务上的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搜索并在这里进行了广泛搜索。到目前为止,我一无所获。
我觉得有两两件事要做,当单元测试授权:
首先,检查权的规则已经被应用。你不必为此执行规则。反思会告诉你是否应用了正确的规则。这是规则以声明方式应用的事实的副产品。更具体地说,您可以使用更高级别的API以及超越反射 - DomainServiceDescription针对DomainService类型。
接下来,测试规则做它应该做的事情。为此,创建一个IPrincipal的模拟实现和一个AuthorizationContext,并调用AuthorizationAttribute的IsAuthorized方法(其中每个属性对应于您要单元测试的规则)。
希望有所帮助。
首先,感谢您的回复。我实际上刚开始做第一次测试...从此以后就没有在这里检查过。其次,我不清楚如何做第二个。作为一个例子,我应该测试一下,当IPrincipal具有正确的角色时,通过AuthorizationContext将RequiresRole应用于IPrincipal会有效吗?显然,我会测试一个自定义的授权规则,因为我认为RequiresRole确实有效:)换句话说,测试授权规则。 – 2010-07-23 14:02:38