nodejs中的单元测试
#javascript #编程 #node #测试

这将是X语言的一系列单元测试(或在这种情况下为HAHA的运行时)。但是目前,我们将坚持单位测试,然后,也许我们可以演变为集成测试。

我想开始本系列,以一种学习某些语言的学习测试的方式,并分析每种语言给我们开始从该重要主题开始的不同侵犯。

我们将要测试的应用程序是我免费和开放API的简单iDeia。 单元测试不涉及API的,但我从其中一个API中获得了想法。

为什么单元测试不涉及API?

我不知道,但是我认为在这一点上有些人会不同意我。但是我认为,单元测试应仅测试您的应用程序的业务规则。而且,成为API只是您向客户端传递的应用程序的一部分,例如,您的应用程序可以使用传感器回答烟雾信号,或者它可以从酒吧/子第三方接收消息,有数百万个选项。如果您不同意,请在评论中与我聊天,我很想与您交谈,我什至都不开玩笑,我真的很想理解您为什么这样想。

继续

我说的免费API。这个想法来自免费食品API的更具体的this one。很棒的API,看看,也许您对一个很酷的项目有一个想法。

我们的小项目将是一个函数(从API到工人,再到推荐算法,都可以使用任何功能),我尝试以非常hexagonal的方式构建它,因为测试确实取决于您的体系结构,除了测试您需要一个良好的拱门,让您可以在不进行许多工作的情况下进行测试(在葡萄牙语中,我们称为“ Gambiarra”)。

export class GetRandomMealUseCase {
  private userFavorites = ["potatoes", "beef"];

  constructor(private mealSerice: IMealService) {}

  async execute(): Promise<
    [Error, { recipe: IMealRecipe; choiceLevel: RandomMealChoice }]
  > {
    try {
      const meal = await this.mealSerice.getRandomMeal();

      const howManyMealTheUserLikes = meal.ingredients.filter(({ name }) =>
        this.userFavorites.includes(name.toLocaleLowerCase())
      ).length;

      const result = { recipe: meal, choiceLevel: RandomMealChoice.Average };

      if (howManyMealTheUserLikes >= 2) {
        result.choiceLevel = RandomMealChoice.ReallyGood;
      } else if (howManyMealTheUserLikes == 1) {
        result.choiceLevel = RandomMealChoice.Good;
      }

      return [null, result];
    } catch (error) {
      return [error as Error, null];
    }
  }
}

基本上,这是我们整个小项目。我们有一项仅提出HTTP请求并进行一些基本错误处理的服务,我选择的是错误处理,就像在元组的第一个位置是错误,而在第二个响应中。我添加了代码中固定的变量userFavorites,但这可能是我们execute方法的参数。

我们有4个针对此小文件看到的测试。每个choiceLevel和1的错误。让我们看看我们如何进行这些测试。

mocha sinonjs 。我们将使用Nodejs使用这两个奇妙的Libs进行测试。摩卡的测试用例和Sinonjs用于我们的模拟。

单位测试

我开始创建一个模拟服务,以便可以将其注入用例。

export const getRandomMealBaseReturn: IMealRecipe = {
  name: "Mock",
  ingredients: [{ name: "Mock", measure: "1" }],
  instructions: 'Mock'
}

export class MealServiceMock implements IMealService {
  async getRandomMeal(): Promise<IMealRecipe> {
    return getRandomMealBaseReturn;
  }
}

那是我们对用餐的模拟。这是家伙的默认回报,我们将在其他测试中嘲笑,以便满足我们的主张。

我们的第一个测试我们只需要这种基本的用餐服务来创建它,因此请在下面查看

describe("GetRandomMeal service tests", () => {
  it("Should return a random meal sucessfuly with average meal choice", async () => {
    const useCase = new GetRandomMealUseCase(new MealServiceMock());

    const result = await useCase.execute();

    assert.strictEqual(result[0], null);
    assert.strictEqual(result[1].choiceLevel, RandomMealChoice.Average);
  });
}

第一次测试只是返回一顿平均选择而没有错误的意思,我们接下来的3个测试将只是嘲笑响应,以便我们可以测试GetRandomMealUseCase的其他分支和错误处理。

就是这样!通过here检查该项目。就像我说的一样

谢谢!