如何为Silverlight单元测试创建InvokeOperation
本文关键字:创建 InvokeOperation 单元测试 Silverlight | 更新日期: 2023-09-27 18:00:08
我正在为我的单元测试模拟DomainContext
调用。
我的真实代码是:
public class SomeDomainService : LinqToSqlDomainService<SomeDataContext>
{
[Invoke]
public bool CodeIsUnique(string code)
{
return !this.DataContext.Objects.Any(o => string.Compare(o.Code, code, true) == 0);
}
}
这是通过以下代码在客户端调用的,该代码实现了一个接口:
public InvokeOperation<bool> CodeIsUnique(string code, Action<InvokeOperation<bool>> action, object userState)
{
return ObjectContext.CodeIsUnique(code, action, userState);
}
其中ObjectContext
是从System.ServiceModel.DomainServices.Client.DomainContext
派生的自动生成类的实例。当从视图模型调用时,执行action
代码:
this.ObjectInterface.CodeIsUnique(currentObject.Code, op =>
{
if (!op.Value)
{
// Code is not unique set error state.
}
}
因此,我创建了一个不进入服务器的模拟实现:
public InvokeOperation<bool> CodeIsUnique(string code, Action<InvokeOperation<bool>> action, object userState)
{
bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0);
InvokeOperation<bool> op = ?????; // Here's the problem
action.Invoke(op);
return op;
}
这在本地List<Object>
上起作用,调用action.Invoke
也起作用,但如果调用中只有null
,则视图模型代码会失败,因为op
是null
(显然)。
因此,我需要创建一个类型为InvokeOperation<bool>
的对象,并将.Value
属性设置为isUnique
。然而,我不知道该怎么做。在第一个实例中,.Value
属性是只读的,在第二个实例中InvokeOperation<T>
没有公共创建者。
如果可以的话,我真的不想在我的测试web项目中创建测试DomainService。
好吧,我用不同的方式解决了这个问题。我没有试图绕过InvokeOperation
,而是这样重新编码:
public void CodeIsUnique(string code, Action<bool, Exception> action)
{
return ObjectContext.CodeIsUnique(code, op =>
{
if (op.HasError)
{
action(false, op.Error);
op.MarkErrorAsHandled();
}
else
{
action(op.Value, null);
}
}, null);
}
这意味着视图模型代码变为:
this.ObjectInterface.CodeIsUnique(currentObject.Code, (result, error) =>
{
if (error != null)
{
// Deal with error
}
else if (!result)
{
// Code is not unique set error state.
}
}
测试代码可以变成:
public void CodeIsUnique(string code, Action<bool, Exception> action)
{
bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0);
action(isUnique, null);
}
因此,代码按预期工作,我不需要创建InvokeOperation
。