我可以将一半实现的模拟转换为具有flowtype的类型吗?

时间:2016-10-27 00:05:38

标签: javascript testing mocking flowtype

我在我的JavaScript中使用flowtype来注释类型。在我的测试中,我也想利用flowtype。

我正在测试一个函数被赋予一个参数,该参数是一个具有另一个函数的对象,并且该另一个函数被调用了具有期望参数的正确次数。

示例代码:

function foo(obj: Bar) {
   obj.bar('bar');
}

示例测试:

test('foo gets bar', t => {
    const mockBar: Bar = {
       bar: sinon.stub(),
    };
    foo(mockBar);
    t.true(mockBar.bar.calledWith('bar'));
});

现在Bar是一个非常复杂的类型,有很多属性等等,并且不容易完全模拟,在这里我只想测试'bar'。 Flowtype没有这个,并且说我的mockBar不是Bar并且我不知道该做什么,除了不在测试中使用flowtype或模拟出来Bar完全以某种方式进行一些小测试需要做很多工作。

我可以简单地以某种方式强制将模拟转换为Bar,方式是flowtype会满意吗?

2 个答案:

答案 0 :(得分:6)

实际上,我可能找到了更好的解决方案。

// Upcast mockBar to any then downcast any to Bar.
// Unsafe downcasting from any is allowed: OK
((mockBar: any): Bar);

上述表达式的类型为Bar

来源:https://flowtype.org/blog/2015/02/18/Typecasts.html

这种方法的好处是只忽略类型转换错误。来自例如的错误仍然会检测到不存在的变量。

答案 1 :(得分:0)

您可以使用Flow的错误抑制注释来忽略错误。您需要在.flowconfig中定义评论模式。

来自docs

suppress_comment(正则表达式):定义一个魔法注释,用于抑制以下行中的任何Flow错误。例如:

suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe

会匹配这样的评论:

// $FlowFixMe: suppressing this error until we can refactor
var x : string = 123;