在 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
  }
}