这将是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检查该项目。就像我说的一样
谢谢!