Javascript 如果函数A使用函数B,我测试函数A,这是集成测试吗?

Javascript 如果函数A使用函数B,我测试函数A,这是集成测试吗?,javascript,unit-testing,integration-testing,Javascript,Unit Testing,Integration Testing,我目前正在写一篇关于JavaScript单元测试的文章。我面临的问题是,我怀疑我的单元测试(见下文)实际上是一个集成测试,这当然使我的文章有点复杂 这就是我得到的。我与摩卡和柴(断言)合作: 对我来说,第一个测试看起来绝对像一个单元测试。如果不考虑单元测试的最佳实践,它将测试一个函数,在本例中,该函数是一个不能划分为较小部分的单元,在本例中,它不依赖于任何其他函数 函数A依赖于函数B。结果是,如果我测试函数A,我必须假设函数A正常工作 所以这让我思考。第二个测试已经是集成测试而不是单元测试了吗

我目前正在写一篇关于JavaScript单元测试的文章。我面临的问题是,我怀疑我的单元测试(见下文)实际上是一个集成测试,这当然使我的文章有点复杂

这就是我得到的。我与摩卡和柴(断言)合作:

对我来说,第一个测试看起来绝对像一个单元测试。如果不考虑单元测试的最佳实践,它将测试一个函数,在本例中,该函数是一个不能划分为较小部分的单元,在本例中,它不依赖于任何其他函数

函数A依赖于函数B。结果是,如果我测试函数A,我必须假设函数A正常工作

所以这让我思考。第二个测试已经是集成测试而不是单元测试了吗

诚恳
Fabian

我认为单元测试和集成测试之间有一条细线。如果
A
使用
B
,严格来说,您测试的不仅仅是您的单元。另一方面,如果该单元足够小,并且UUT(被测试单元)的一个重要部分是您调用的代码代码>代码,我想您仍然可以将其视为单元测试。当我谈到集成测试时,我是在测试整个链。另一件需要记住的重要事情是@deceze已经提到的:“您很少有不使用任何其他函数的代码。在函数语言中,甚至运算符都是函数,因此没有不使用其他函数的代码。因此,每个测试都将是一个集成测试。”

假设我们有一个用户可以注册的系统。就个人而言,我会在单元测试中测试
寄存器
单元。在这种情况下,我可以编写一个存根,而不是对真实数据库进行测试(仍然称之为单元测试)。之后,我将编写一个集成测试,测试用户是否可以注册并使用新创建的帐户登录


以下由Martin Fowler撰写的文章可能很有趣:

您很少有不使用任何其他函数的代码。在函数式语言中,甚至运算符都是函数,因此没有不使用其他函数的代码。因此,每个测试都将是一个集成测试。可能吧,但在某种程度上,我认为您可以意识到这两者之间没有任何明显的障碍,并讨论“自动化测试”。当然,您的测试越是孤立和独立,您就越可以调用它们。我学习集成测试与单元测试的方法是,如果组件使用确定性函数,您仍然可以将其视为单元测试,但是当它是非确定性的时,它显然是一个集成test@RobG当然,你是对的。很抱歉,我会编辑它。A的单元测试并不取决于B的结果是否正确,只取决于它是
1+
无论
B(I)
返回什么。测试B的返回值是一个单独的测试。i、 e.测试应该是“A(i)返回B(i)+1”(或任何适当的语法)。
// region Implementation

/**
 * @param {number} i
 * @returns {number} i + 2
 */
function A(i) {
    return B(i + 1);
}

/**
 * @param {number} i
 * @returns {number} i + 1
 */
function B(i) {
    return i + 1;
}

// endregion

// region Test

lt("B(i) returns i + 1", () => {
    assert.equals(B(2), 3);
})

lt("A(i) returns i + 2", () => {
    assert.equals(B(2), 4);
})

// endregion