如何为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,则视图模型代码会失败,因为opnull(显然)。

因此,我需要创建一个类型为InvokeOperation<bool>的对象,并将.Value属性设置为isUnique。然而,我不知道该怎么做。在第一个实例中,.Value属性是只读的,在第二个实例中InvokeOperation<T>没有公共创建者。

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

如何为Silverlight单元测试创建InvokeOperation

好吧,我用不同的方式解决了这个问题。我没有试图绕过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