Макет прототипа класса в javascript с шуткой - PullRequest
1 голос
/ 20 апреля 2019

Я в настоящее время нахожусь в проекте, и мне нужно mock определенное constructor class prototype, чтобы запустить тест, чтобы он не работал напрямую с моими database.Я уже пытался исследовать и обнаружил, что мне нужно import module в мой файл mock, а затем export в мой файл test и использовать jest.setMock() для замены модуля в моем файле test.js.Ниже приведен код того, что я пробовал.

У меня есть Admin constructor class с функцией удаления в его prototype, отвечающей за удаление из db

admin.js

function Admin(username, email, password, access) {
    Users.call(this, username, email, password, access);
}

Admin.constructor = Admin;

Admin.prototype.deleteSingleUser = function(id, accountType) {
   this.id = id;
   this.accountType = accountType;

    let response = "";

    if(this.accountType === "admin") {
        for(let i in dbData.admin) {
            if(dbData.admin[i].id === this.id) {
                dbData.admin.splice(i, 1);
                fs.writeFileSync('db.json', JSON.stringify(dbData, null, 2));
                console.log(dbData.admin);
                response = "Account successfully deleted";
            }
            else {
                response = "There is no user registered with this ID";
            }
        }
    }
    else if(this.accountType === "user") {
        for(let i in dbData.users) {
            if(dbData.users[i].id === this.id) {
                dbData.users.splice(i, 1);
                fs.writeFileSync('db.json', JSON.stringify(dbData, null, 2));
                console.log(dbData.users);
                response = "Account successfully deleted";
            }
            else {
                response = "There is no user registered with this ID";
            }
        }
    }
    else {
        response = "Kindly use a valid account type";
    }
    console.log(response);
    return response;
};

Затем в моем каталоге __mocks__ у меня есть файл admin.js, содержащий базу данных mock и мой mock код удаления

__ mocks __ / admin.js

//Imported the admin.js

let Admin = require("../admin");

//Created a mock database
let mockDb = {
    "users": [
        {
            "id": 1,
            "username": "aaa",
            "email": "aaa@gmail.com",
            "password": "aaa",
            "access": "user"
        }
    ],
    "admin": [
        {
            "id": 1,
            "username": "bbb",
            "email": "bbb@gmail.com",
            "password": "bbb",
            "access": "admin"
        }
    ]
} 

//My mock delete function

Admin.prototype.deleteSingleUser = function(id, accountType) {
    this.id = id;
    this.accountType = accountType;

    let response = "";

    if (this.accountType === "admin") {
        if(mockDb.admin[0].id === this.id) {
            response = "Account successfully deleted";
        }
        else {
            response = "There is no user registered with this ID";
        }
    }
    else if (this.accountType === "user") {
        if(mockDb.users[0].id === this.id) {
            response = "Account successfully deleted";
        }
        else {
            response = "There is no user registered with this ID";
        }
    }
    console.log("Its using the mock");
    return response;
};
module.exports = Admin;

Затем в моей папке __test__ у меня есть файл test.js с моими тестами

__ test __ /test.js

const Admin = require("../admin");
jest.setMock("Admin", require("../__mocks__/admin"));

test("Should check if admin can delete with a wrong id", () => {
    let response = Admin.prototype.deleteSingleUser(0, "user");
    expect(response).toBe("There is no user registered with this ID");
});
test("Should check if admin can delete a user", () => {
    let response = Admin.prototype.deleteSingleUser(1, "user");
    expect(response).toBe("Account successfully deleted");
});

Ни один из тестовых примеров не пройден, но оба throw и error говорят

Тестовый набор не может быть запущен

Не удается найти модуль «Admin» из «test.js»

2 |const Users = require ("../ main");

3 |const Admin = require ("../ admin");

4 |jest.setMock ("Admin", require ("../ mocks / admin"));

|^

5 |const order = require ("../ order");

6 |let mocks = require ("../ mocks / admin");

7 |let dbData = JSON.parse (fs.readFileSync ('db.json'));

в Resolver.resolveModule (node_modules / jest-resol / build / index.js: 229: 17)

at Object.setMock ( test / test.js: 4: 6)

Мне кажется, что я что-то не так делаю, но, кажется, не могу это указать,Пожалуйста, в чем проблема и как я могу это исправить?Спасибо.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Вам вообще не нужно использовать jest.setMock.

Вам просто нужно активировать ручной макет , который вы создали для своего пользовательского модуля, выполнив следующее:

jest.mock('../admin');  // <= activate the manual mock

Подробнее

Документы для jest.setMock утверждают, что его следует использовать только в «крайне редких случаях», когда «даже ручной макет не подходит для ваших целей», и добавляет, что это «* 1017». * рекомендуется использовать jest.mock() вместо."

В этом случае вы не делаете ничего, что потребовало бы jest.setMock, поэтому лучше всего активировать ручной макет с помощью jest.mock.

1 голос
/ 21 апреля 2019

Ваш код, кажется, в порядке. Вам просто нужно установить jest.setMock(), чтобы он указывал на нужный файл.

jest.setMock() принимает два параметра jest.setMock(moduleName, moduleExports). moduleName должен указывать на файл, содержащий module, над которым вы издеваетесь, и moduleExports на файл, содержащий ваш макетный модуль. Другими словами, измените свой

__ тест __ / test.js

jest.setMock("Admin", require("../__mocks__/admin"));

до

jest.setMock("../admin", require("../__mocks__/admin"));

И с тобой все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...