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

时间:2011-06-24 09:23:14

标签: 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.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>没有公共创建者。

如果我能提供帮助,我真的不想在我的测试网站项目中创建测试DomainService。

1 个答案:

答案 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