typemoq中的模拟和字符串数组参数

时间:2017-06-13 11:52:57

标签: typescript mocking

我在类别中的类上有一个方法,如下所示:

class validator {
  checkAThing(errors: string[], thing: string): Promise<string[]> {
    // returns a promise
  }
}

我想使用typemoq

来模拟这个

所以我有类似的东西:

let mock = TypeMoq.Mock.ofType(validator);
mock.setup(x => x.checkAThing(??????, TypeMoq.It.isAnyString()))
    .returns((x, y) => {
        return Promise.resolve(x);
     })

问题是我不确定如何为第一个接受任何字符串数组的字符串[]指定匹配器?

如果Typemoq无法使用其他模拟技术,我很高兴。

2 个答案:

答案 0 :(得分:3)

如果你只是设置一个回报并且不关心它所调用的param值,那么你可以使用It.isAny()

// will always return the specified value (regardless of what it's called with)
mock.setup(x => x.checkAThing(TypeMoq.It.isAny(), TypeMoq.It.isAny()))
    .returns((x, y) => {
        return Promise.resolve(x);
     })

如果您真的关心使用string[]调用模拟器,您可以通过执行类似的操作来使用typemoq的谓词匹配器(尽管看起来有点矫枉过正):

 TypeMoq.It.is<string[]>(param => 
     Array.isArray(param) && param.every(item => typeof item === "string");

https://github.com/florinn/typemoq#setup-mocks

答案 1 :(得分:0)

我已经尝试了It.isAny()和It.is()并得到错误。

connectionManagementService.setup(x => x.getConnectionGroups(TypeMoq.It.is<string[]>(s => s[0] === Constants.sqlLogin))).returns(() => [conProfGroup]);

Error: the object {
"ctx": {"_args": "[object Arguments]""_property": {"name": "getConnectionGroups"
  "obj": {
    "onAddConnectionProfile": [undefined]
    "onConnectionChanged": [undefined]
    "onDeleteConnectionProfile": [undefined]
    "onLanguageFlavorChanged": [undefined]
  }
} }  "message": [undefined]   "name": "Mock Exception"   "reason": "no setup  expression" } was thrown, throw an Error :)