我正在尝试模拟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>
没有公共创建者。
如果我能提供帮助,我真的不想在我的测试网站项目中创建测试DomainService。
答案 0 :(得分:0)
好的,我以不同的方式解决了这个问题。我没有试图绕过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
。