如何用玩笑嘲笑uuid

Edu*_*nto 4 javascript uuid jestjs

因此,在寻找问题的答案的过程中,我发现了以下信息:开玩笑:如何全局模拟node-uuid(或任何其他导入的模块)

我已经尝试了答案,但似乎无法正确使用它,因为它给了我未定义的错误。我是测试领域的新手,所以请原谅任何重大错误:

这是我的第一个方法

const mockF = jest.mock('uuid'); 

mockF.mockReturnValue('12345789'); 
Run Code Online (Sandbox Code Playgroud)

但是它无法识别功能。

我尝试了“ mockF.mockReturnValue不是一个函数”。

然后我尝试按照帖子的建议进行手动模拟,但似乎无法使其正常工作,您能帮我吗?谢谢

这是整个测试是否有帮助:

    const faker = require('faker');
    const storageUtils = require('../../storage/utils');
    const utils = require('../utils/generateFile');
    const { generateFileName } = storageUtils;
    const { file } = utils;

    test('should return a valid file name when provided the correct information', () => {
        // ARRANGE
        // create a scope
        const scope = {
            type: 'RECRUITER',
            _id: '987654321',
        };
        // establish what the expected name to be returned is
        const expectedName = 'r_987654321_123456789.png';

        jest.mock('uuid/v4', () => () => '123456789');

        // ACTION
        const received = generateFileName(file, scope);

        // ASSERT
        // expect the returned value to equal our expected one
        expect(received).toBe(expectedName);
    });
Run Code Online (Sandbox Code Playgroud)

小智 36

我想我不妨在这里添加我的解决方案,供后代使用。以上都不是我所需要的:

jest.mock('uuid', () => ({ v4: () => '123456789' }));
Run Code Online (Sandbox Code Playgroud)

顺便说一句,使用变量而不是'123456789'破坏它。

这应该在我们有导入的地方进行模拟,并且不需要您uuid在规范文件中显式导入。

  • 这。我花了将近两个小时试图弄清楚,我尝试了相同的语法(尽管使用了 nanoid)但一直失败。诀窍是将其放在导入之后并避免使用变量...... (4认同)
  • 您应该通过指定导入及其声明范围来改进您的答案 (2认同)

see*_*etd 11

假设有以下测试文件,您可以使用 jest.spyOn 调用来模拟 uuid。

测试规范.js

import uuid from 'uuid';
import testTarget from './testTarget';

describe('mock uuid', () => {
  it('should return testid }', () => {
    // Arrange
    const anonymousId = 'testid';
    const v1Spy = jest.spyOn(uuid, 'v1').mockReturnValue(anonymousId);

    // Act
    const result = testTarget();

    // Assert
    expect(result).toEqual(anonymousId);
    expect(v1Spy).toHaveBeenCalledTimes(1);
  });  
});
Run Code Online (Sandbox Code Playgroud)

测试目标.js

import uuid from 'uuid';
export default function() {
   return uuid.v1();
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到错误“无法监视原始值;未定义给定`:/ (6认同)

小智 11

如果jest.mock('uuid')范围错误,可能会出现问题。

这对我来说是正确的

import * as uuid from 'uuid';
jest.mock('uuid');
describe('utils', () => {
    it('test', () => {
        jest.spyOn(uuid, 'v4').mockReturnValue('mockedValue')
    });
});
Run Code Online (Sandbox Code Playgroud)

这是不正确的

import * as uuid from 'uuid';
describe('utils', () => {
    it('test', () => {
        jest.mock('uuid');
        jest.spyOn(uuid, 'v4').mockReturnValue('mockedValue')
    });
});
Run Code Online (Sandbox Code Playgroud)


ada*_*een 9

这对我有用。就我而言,我只想验证函数是否被调用,而不是对特定值进行断言。

import * as uuid from 'uuid';
jest.mock('uuid');

const uuidSpy = jest.spyOn(uuid, 'v4');

// in a test block
expect(uuidSpy).toHaveBeenCalledTimes(1);
Run Code Online (Sandbox Code Playgroud)


Hen*_*sen 8

对于我的情况,我使用了这个Github 问题的答案

jest.mock('uuid/v4', () => {
 let value = 0;
 return () => value++;
});
Run Code Online (Sandbox Code Playgroud)


Sha*_*ech 6

使用来模拟它mockImplementation

import uuid from 'uuid/v4';
jest.mock('uuid/v4');

describe('mock uuid', () => {
  it('should return testid }', () => {
    uuid.mockImplementation(() => 'testid');
    ...
  });  
});
Run Code Online (Sandbox Code Playgroud)

确保您import uuid正确(使用正确的版本参考,例如v4,v3 ...)

  • 我按照示例中提供的操作进行了操作,但出现此错误:类型'v4'上不存在属性'mockImplementation'。 (2认同)

rau*_*a08 5

希望以下两个例子对您有所帮助。

假设您需要一个 JS 模块,其唯一职责是生成 UUID。采用 TDD 方法,我们从断言开始,最终发现我们需要一些UUIDGenerator方法来返回 UUID:

it('should generate UUID', () => {
    const myUUID = UUIDGenerator.nextUUID();
    expect(myUUID).toEqual('some-short-v4-uuid-0');
});
Run Code Online (Sandbox Code Playgroud)

测试形成UUIDGenerator.ts以下代码:

import {v4 as uuidv4} from 'uuid';
const UUIDGenerator = {
  storeUUID(): string {
    return uuidv4();
  }
};
export default UUIDGenerator;
Run Code Online (Sandbox Code Playgroud)

现在我们想要模拟UUIDGenerator对 uuid 模块的依赖。我们可以通过使用jestjs.io 上记录的模块工厂参数调用 jest.mock() 来做到这一点。我们现在可以简单地描述笑话应该如何表现,

jest.mock('uuid',() => ({
    v4: () => 'some-short-v4-uuid-0'
}));
describe('UUIDGenerator', () => { 
    // it block from above
});
Run Code Online (Sandbox Code Playgroud)

您现在应该看到您通过了测试。

uuid.ts另一种选择是在项目中的某个位置创建一些:

import {v4 as uuidv4} from 'uuid';
export default uuidv4;
Run Code Online (Sandbox Code Playgroud)

并将其导入UUIDGenerator.ts

import uuidv4 from '../uuid';
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您应该能够嘲笑您的uuid.ts. 我将我的目录放在父目录中(相对于UUIDGenerator.ts),以便您可以看到有关如何在不在同一目录中时找到它的示例。

jest.mock('../uuid',
  () => jest.fn(() => '1-234-5678')
);
Run Code Online (Sandbox Code Playgroud)