我正在为我们的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搜索并在此广泛搜索。到目前为止我什么都没有。
答案 0 :(得分:1)
我认为在单元测试授权时有两件事要做:
首先,检查是否已应用正确的规则。您不必为此执行规则。反射告诉您是否已应用正确的规则。这是规则应用规则这一事实的副产品。更具体地说,您将使用更高级别的API,而不仅仅是针对DomainService类型的DomainServiceDescription。
接下来,测试规则会执行它应该执行的操作。为此创建一个IPrincipal和AuthorizationContext的模拟实现,并调用AuthorizationAttribute的IsAuthorized方法(其中每个属性对应于您要进行单元测试的规则)。
希望有所帮助。