我如何断言传递给类构造函数的函数是通过引用传递的,并且在使用组合时不会重复?

时间:2019-06-14 18:17:23

标签: javascript unit-testing

在下面的代码中,我可以轻松断言zombieZombie的实例。

创建zombie时,会将功能bitmapRenderer发送给它,并成为“僵尸”内部的功能render()

我假设由于bitmapRenderer是一个函数(它是一个对象),因此它通过引用传递。我可以创建任意数量的僵尸,而不必再创建任何bitmapRenderer函数,不会浪费任何内存,但是如何通过断言证明这一点呢?

function bitmapRenderer(drawable) {
    console.log('I am bitmapRenderer function', drawable);
}

class Zombie {
    constructor(renderer) {
        this.renderer = renderer;
        this.x = 100;
        this.y = 100;
        this.name = 'zombie';
    }
    render() {
        this.renderer(this);
    }
}

const zombie = new Zombie(bitmapRenderer);
console.assert(zombie instanceof Zombie);

2 个答案:

答案 0 :(得分:2)

只需使用console.log(zombie.renderer === bitmapRenderer);

这证明了它们是相同的,因为即使对象具有相同的属性,除非它们具有相同的引用,否则它们始终将被视为不相等。

var obj1 = { "a": "A" };
var obj2 = { "a": "A" };
console.log(obj1 === obj2); // false

var obj3 = obj2;
console.log(obj2 === obj3); // true

答案 1 :(得分:1)

您无需在Zombie类中进行测试。
可以测试的是Zombie的使用者。
您可能会有一个带有工厂的单独模块,该工厂将为您创建僵尸。

import Zombie from 'models/zombie`;

function spawnZombie () {
  return new Zombie(bitmapRenderer);
}

在测试此模块时,您应该模拟Zombie,以便可以跟踪其实例化方式。
具体来说,您将检查renderer参数是否是对bitmapRenderer的引用。


添加。

但是,如果您不想大量更改代码并将其保留为示例中的样式,则只需检查zombie.renderer === bitmapRenderer
这只是您课堂上的一个公共领域。