C# 如何为Silverlight单元测试创建InvokeOperation?

C# 如何为Silverlight单元测试创建InvokeOperation?,c#,silverlight,unit-testing,C#,Silverlight,Unit Testing,我正在尝试为我的单元测试模拟DomainContext调用 我的真实代码是: public class SomeDomainService : LinqToSqlDomainService<SomeDataContext> { [Invoke] public bool CodeIsUnique(string code) { return !this.DataContext.Objects.Any(o => string.Compare(o

我正在尝试为我的单元测试模拟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)
    {
        bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0);
        InvokeOperation<bool> op = ?????;  // Here's the problem

        action.Invoke(op);

        return op;
    }
这可以通过本地列表和调用action.Invoke工作,但是调用中只有null,视图模型代码就会失败,因为op显然是null

所以我需要做的是创建一个InvokeOperation类型的对象,并将.Value属性设置为isUnique。然而,我不知道该如何解决这个问题。在第一个实例中,.Value属性是只读的,而在第二个实例中,没有用于InvokeOperation的公共创建者


如果可以的话,我真的不想在我的测试web项目中创建测试域服务。

好的,我用另一种方式解决了这个问题。我没有试着传递调用操作,而是将其重新编码为:

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);
}
测试代码可以是:

public void CodeIsUnique(string code, Action<bool, Exception> action)
{
    bool isUnique = !_list.Any(o => string.Compare(o.Code, code) == 0);
    action(isUnique, null);
}
因此,代码按预期工作,我不需要创建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);
}