我正在尝试为用Appcelerator Titan开发的移动应用程序编写单元测试。我正在尝试使用TiUnit和Jasmine对它进行单元测试。
我的一种方法使用String.format()
。由于未在Javascript中定义String.format()
,我该如何对该方法进行单元测试?
function MyMethod(_flag, _myProperty, _propertyValue) {
if(_flag) {
_myProperty = String.format('The value :', _propertyValue);
}
}
可以嘲笑吗?或者我可以在茉莉花的String原型中添加format(),以便每当遇到要测试的.js中的format()时,它都执行我将在测试套件中定义的format()?
答案 0 :(得分:1)
解决此问题的一种方法是使它成为pure function。
以这个小的变化为例:
function MyMethod(_flag, _myProperty, _propertyValue, formatFunction) {
if(_flag) {
_myProperty = formatFunction('The value :', _propertyValue);
}
}
现在MyMethod
对函数外部的任何内容都没有依赖性。这样,您就可以使用所需的任何字符串格式化程序,并且可以使用模拟的格式化程序。
在测试中,您现在可以执行以下操作:
it('should format the string', () => {
const mockFormatter = () => {/*do the mock operation of your choosing here*/}
const formattedString = MyMethod(yourFlag, yourProperty, yourPropertyValue, mockFormatter)
assert(formattedString, expectedOutput)
})
这允许您不必操纵全局String对象/原型,而在其他地方可能会有影响。相反,您可以创建一个与格式化程序无关的函数,并且可以轻松地对其进行模拟。
最后,既然我希望能为您提出原始问题提供一条前进的道路,我很好奇您为什么嘲笑格式化程序?这似乎是您始终想要验证的东西,并且这样做没有任何危害。对我来说,这可能会导致对测试进行非常深入的讨论,而且常常是徒劳的讨论,作为单元测试已经足够了。它不是“纯粹的”,但是就副作用而言,没有副作用,并且您正在测试一些关于不进行数据操作的基本期望。
我认为模拟String.format()
会给测试带来不必要的复杂性,而不会真正提高代码的置信度。
**编辑:我假设String.format()
是一个我从未听说过的JS函数,但事实并非如此。
要达到目标,并避免完全模拟,我认为您应该通过字符串文字或连接使用字符串插值。
查看此处:
function MyMethod(_flag, _myProperty, _propertyValue) {
if(_flag) {
_myProperty = `The value : ${_propertyValue}`; // option 1 uses interpolation
// _myProperty = 'The value : ' + _propertyValue; // option 2 uses concatenation
}
}