在 jasmine 中模拟 string.Format
Mock string.Format in jasmine
我正在尝试为使用 Appcelerator titanium 开发的移动应用程序编写单元测试。我正在尝试使用 TiUnit 和 Jasmine 对其进行单元测试。
我的一种方法使用 String.format()
。我如何对该方法进行单元测试,因为 String.format()
未在 Javascript 中定义?
function MyMethod(_flag, _myProperty, _propertyValue) {
if(_flag) {
_myProperty = String.format('The value :', _propertyValue);
}
}
是否可以模拟这个?还是我可以在jasmine的String的原型中加上format(),让它在测试的.js中遇到format(),就执行我在测试套件中定义的format()?
解决此问题的一种方法是将其设为 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)
})
这允许您不必操纵全局字符串 object/prototypes,这可能会对其他地方产生影响。相反,您创建了一个与格式化程序无关的函数 并且 能够轻松地模拟它。
最后,既然我希望能为您的原始问题提供一条前进的道路,我很好奇您为什么要模拟格式化程序?这似乎是您总是想要验证的事情,并且这样做没有任何坏处。对我来说,这可能会导致非常深入且经常对测试进行迂腐的讨论,这已经足够作为单元测试了。它不是 "pure",但就副作用而言,有 none 并且您正在测试一些关于数据操作的基本期望,而没有。
我认为模拟 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
}
}
我正在尝试为使用 Appcelerator titanium 开发的移动应用程序编写单元测试。我正在尝试使用 TiUnit 和 Jasmine 对其进行单元测试。
我的一种方法使用 String.format()
。我如何对该方法进行单元测试,因为 String.format()
未在 Javascript 中定义?
function MyMethod(_flag, _myProperty, _propertyValue) {
if(_flag) {
_myProperty = String.format('The value :', _propertyValue);
}
}
是否可以模拟这个?还是我可以在jasmine的String的原型中加上format(),让它在测试的.js中遇到format(),就执行我在测试套件中定义的format()?
解决此问题的一种方法是将其设为 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)
})
这允许您不必操纵全局字符串 object/prototypes,这可能会对其他地方产生影响。相反,您创建了一个与格式化程序无关的函数 并且 能够轻松地模拟它。
最后,既然我希望能为您的原始问题提供一条前进的道路,我很好奇您为什么要模拟格式化程序?这似乎是您总是想要验证的事情,并且这样做没有任何坏处。对我来说,这可能会导致非常深入且经常对测试进行迂腐的讨论,这已经足够作为单元测试了。它不是 "pure",但就副作用而言,有 none 并且您正在测试一些关于数据操作的基本期望,而没有。
我认为模拟 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
}
}