检查扩展是否应用于observable

时间:2013-04-10 15:11:52

标签: knockout.js knockout-validation knockout-extensions

我想对我的函数进行单元测试,该函数基本上是从一组参数(TypeScript代码)构建一个observable数组:

private BuildObservables(parameters: Parameter[]) {
        var observables = {};

        for (var parameterName in parameters) {

            var p = parameters[parameterName];

            // Build observable
            observables[parameterName] = ko.observable(p.Value);

            // Attach validation
            if (p.IsRequired) {
                observables[parameterName].extend({ required: true });
            }
        }
        return observables;
    }

我的测试看起来像这样:

var parameters = [];

// new Parameter(int value, bool isRequired)
parameters["Param1"] = new Parameter("123", true);
parameters["Param2"] = new Parameter("456", false);

var viewModel = BuildObservables(parameters);

ok(viewModel["Param1"] != null);
ok(viewModel["Param2"] != null);

如果第一个参数isRequired设置为true,如何检查是否应用了扩展(验证)(BuildObservables中的“附加验证”部分)?

修改

在另一个功能中,我正在附加订阅者,我不知道如何测试它们是否正确连接。

2 个答案:

答案 0 :(得分:4)

你可以在你的observable上调用rules(),它应该给你一个数组。

observables[parameterName].rules();

答案 1 :(得分:1)

我对你的特定情况的验证插件了解不多,但更笼统地说,我怀疑是否可以找出是否已经扩展了一个observable,因为扩展机制非常通用而且不强加特定的要对“扩展”可观察对象执行的操作,将操作的所有细节留给扩展器本身(因此结果可能差异很大,包括包装可观察对象,订阅它,甚至只是在外部服务中注册可观察量或介于两者之间的任何事情。)

如果您的问题仅用于单元测试 ,您可以考虑模拟extend函数,以便它存储传递给它的参数(即扩展程序),它会被调用 - 这以后你可以检查所述扩展器的存在。

对于更精细的内容,测试库jasmine为模型提供了更多选项,包括检查是否调用了特定函数以及是否将某些特定参数传递给它的测试,因此您可能会对此感兴趣它也是。