【问题标题】:What could be the right way to test functions combined when applying Integration testing? [closed]在应用集成测试时,测试组合功能的正确方法是什么? [关闭]
【发布时间】:2018-05-25 11:07:36
【问题描述】:

一个名为“validateData”的函数是单独测试的,为简单起见,它只有 2 个测试,但是当我将此函数组合到另一个函数中时,我发现自己重复(几乎)相同的测试,例如:

src/controllers/user/createUser.js

export function validateData(data) {
  if (!data) {
    const err = new Error('data must be present');
    err.code = 400;
    throw err;
  }
  return data;
}

export async function createUser(data) {
  validateData(data);
  try {
    const user = await UserModel.create(data);
    return 'ok';
  } catch(err) {
    throw err;
  }
}

export default createUser;

src/router/user/index.js

// Dependencies:
import { Router } from 'express';
import users from 'controllers/user/createUser';
import { methodNotAllowed } from 'utils/helpers';

// Helpers:
const router = Router();

router.route('/users')
  .post((req, res) => {
    createUser(req.body)
    .then(summary => res.status(201).json({ message: "created" }))
    .catch(err => res.status(400).json({ err: err.message }));
  })
  .all(methodNotAllowed(`Use solely POST method in this action.`));

test/controllers/user/createUser.test.js

import { should, expect } from 'chai';
import { validateData, createUser } from 'controllers/user/createUser';

describe('Controller', () => {

  describe('#validateData', () => {
    describe('when data is not send', () => {
      it("should return error: 'data must be present'", () => {
        (() => validateData(null))
          .should.Throw("'data' must be present")
          .with.property('code', 400);
      });
    });
    describe('when data is sent', () => {
      it("should return the same data input", () => {
        const input  = { firstName: 'Norman', lastName: 'etc' };
        const output = validateData(input);
        output.should.equal(input);
      });
    });
  });

  describe('#createUser', () => {
    describe('when data is not send', () => {
      it("should return error: 'data must be present'", async () => {
        try {
          await createUser(null)
        } catch(err) {
          err.should.include({
            code: 400, 
            message: "data must be present" 
          });
        }
      });
    });
    describe('when data is sent', () => {
      it("should return the same data input", async () => {
        const input  = { firstName: 'Norman', lastName: 'etc' };
        const output = await createUser(input);
        output.should.equal('ok');
      });
    });
  });

});

因此,如果您看到我在“createUser”函​​数中重用了相同的函数“validateData”,那么它也会抛出与之前在“#validateData”描述块中测试过的相同的错误。

在测试软件中可以吗?

另外我必须用 express 重用这两个函数,所以“validateData”的测试将被测试 3 次。

1. #validateData, 2. #createUser and 3. #POST /users

我想知道这是否可以,因为对我来说似乎还可以,但测试变得混乱,因为我将许多功能组合在一起以获得所需的结果。

【问题讨论】:

    标签: unit-testing mocha.js tdd integration-testing bdd


    【解决方案1】:

    您希望避免多次测试函数 validateData 的内部结构。

    如果您能够中断调用更改并将具体函数 validateData 替换为可以断言它已被调用的模拟,那么这应该足以验证是否调用了 validateData。

    如果您能够将 validateData 替换为 stub,即对于给定输入将返回硬编码输出的预打包版本,那么您可以使用它来验证调用方在 validateData 返回众所周知的值时是否正常运行对于一个众所周知的输入。

    最后,如果您使用相同的输入验证 validateData 并期望输出相同,就像您在上面的存根中使用的那样,您可以非常确定它在投入生产时会起作用。至少对于您使用存根验证的情况,然后再使用 validateData。

    在许多地方重复相同的测试很麻烦,并且会产生维护负担。

    【讨论】:

    • 好的,在多个地方多次测试同一个“validateData”并不是一个好主意,因为它更易于维护。感谢您的回复!。
    猜你喜欢
    • 2011-04-09
    • 2012-12-31
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多