我尝试过使用Jasmine Matchers,它确实给了我一个关于错误消息的详细信息。单元测试也变得有意义但是当涉及分布式和大型项目时,我不确定匹配器如何发挥良好作用。
下面是我的示例脚本的匹配器示例。
beforeEach(function () {
jasmine.addMatchers({
toBeAGoodInvestment: toBeAGoodInvestment
});
});
function toBeAGoodInvestment() {
return {
compare: function (actual, expected) {
// Matcher Definition
var result = {};
result.pass = actual.isGood();
if (actual.isGood()) {
result.message = 'Expected investment to be a bad investment';
} else {
result.message = 'Expected investment to be a good investment';
}
return result;
}
}
}
和spec文件如下
describe('Investment', function () {
var stock, investment;
beforeEach(function () {
stock = new Stock();
investment = new Investment({
stock: stock,
shares: 100,
sharePrice: 20
});
});
it('should be of a stock', function () {
expect(investment.stock).toBe(stock);
});
it('should have invested shares quantity', function () {
expect(investment.shares).toBe(100)
});
it('should have the share paid price', function () {
expect(investment.sharePrice).toBe(20);
});
it('should have a cost', function () {
expect(investment.cost).toBe(2000)
});
describe('when its stock share price valorizes', function () {
beforeEach(function () {
stock.sharePrice = 40;
});
it('should have a positive roi', function () {
expect(investment.roi()).toEqual(1);
});
it('should be a good investment', function () {
expect(investment.isGood()).toEqual(true);
});
it('matcher: should be a good investment', function () {
expect(investment).toBeAGoodInvestment();
});
});
});
我添加了默认的Jasmine匹配器单元测试用例以及自定义匹配器。我不确定这对大型项目有何帮助。如果有任何关于如何使用这些匹配器的原则指导那么它会很棒
答案 0 :(得分:0)
我认为项目规模与编写自定义Jasmine匹配器的实用性之间没有明确的直接关系。
自定义Jasmine匹配器可以对测试代码的质量,可读性和紧凑性产生多种积极影响,无论代码库的大小如何:
虽然作者有责任使匹配器提供明确且易于理解的反馈,以防发生断言错误。我不确定你的“好”和“坏”投资规则有多清楚,但是,乍一看,我会说错误如下:
预期投资是一项良好的投资
不够清楚 - 比较它,例如:
预期投资是一项良好的投资。共享价格低于配置的最低价格(30)。
换句话说,当它失败时,提供尽可能多的信息,只需告诉所有内容。
另一个经常被忽视的一点是自定义匹配器应该引入任何副作用或更改断言下的对象。这可能会导致难以调试的意外。