.net 如何编写单元测试来验证WCF-RIA服务域服务查询方法是否需要身份验证?

.net 如何编写单元测试来验证WCF-RIA服务域服务查询方法是否需要身份验证?,.net,unit-testing,wcf-ria-services,.net,Unit Testing,Wcf Ria Services,我正在为我们的WCF RIA服务进行单元测试,这些服务附带了RequiresRole或RequiresAuthentication属性。我已经能够测试Update、Insert和Delete方法,以确保属性设置正确。这是通过模拟iSeries provider,使用该提供程序和正确的域操作类型创建域服务上下文,向服务提供程序添加IPrincipal服务,然后使用适当的变更集对服务运行提交()。这似乎很有效 但是,我无法测试查询调用。这些是通过服务上的Query()方法调用的。因此,我正在做与其他

我正在为我们的WCF RIA服务进行单元测试,这些服务附带了
RequiresRole
RequiresAuthentication
属性。我已经能够测试Update、Insert和Delete方法,以确保属性设置正确。这是通过模拟
iSeries provider
,使用该提供程序和正确的
域操作类型创建
域服务上下文
,向服务提供程序添加
IPrincipal
服务,然后使用适当的
变更集对服务运行
提交()
。这似乎很有效

但是,我无法测试查询调用。这些是通过服务上的
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);
string operationName=“GetUsers”;
DomainServiceContext DomainServiceContext=GetDomainServiceContext(
验证:false,
operationType:DomainOperationType.Query);
DomainOperationQuery操作查询=mocks.DynamicMock(
typeof(UserService)、operationName、DomainOperation.Query、,
typeof(IQueryable),新列表(),
新属性集合());
mocks.ReplayAll();
初始化(domainServiceContext);
整数总数;
i可数验证错误;
QueryDescription=新的QueryDescription(operationEntry);
查询(queryDescription、out ValidationErrors、out TotalCount);
当在
GetUsers
查询上设置了
requireauthentication
时,这应该会引发
UnauthorizedAccessException
。但是,无论属性是否设置,我都不会得到任何信息。使用在
GetUsers
方法上设置断点的调试器,我可以看到该方法从未被调用。我猜我把
操作名
搞错了。但我不知道这是否是问题所在,或者,如果是的话,我应该把它改成什么


有人对此有什么见解吗?我搜索了整个MSDN,做了谷歌搜索,在这里进行了广泛的搜索。到目前为止,我什么都没有。

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

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

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


希望能有所帮助。

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

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

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


希望能有所帮助。

首先,感谢您的回复。事实上,我不久前就开始做第一次测试了…只是从那以后就没有在这里检查过。第二,我不太清楚如何做第二个。例如,我应该测试一下,当IPrincipal具有正确的角色时,通过授权上下文应用于IPrincipal的RequiresRole是否有效?显然,我会测试一个自定义授权规则,因为我假设RequiresRole确实正常工作:)换句话说,测试授权规则。首先,感谢您的响应。事实上,我不久前就开始做第一次测试了…只是从那以后就没有在这里检查过。第二,我不太清楚如何做第二个。例如,我应该测试一下,当IPrincipal具有正确的角色时,通过授权上下文应用于IPrincipal的RequiresRole是否有效?显然,我会测试一个自定义授权规则,因为我假设RequiresRole确实正常工作:)换句话说,测试授权规则。