我有依賴于 A 類的 B 類。我想測驗 B 類的方法,該方法在內部呼叫 A 類的方法。現在,我想通過模擬 A 類來單元測驗我的 B 類方法。
我的代碼結構:
class A {
getSomething() {
return "Something";
}
}
class B {
constructor(objectOfClassA: A) {
this._objectOfClassA = objectOfClassA;
}
functionofClassBToTest() {
const returnValueFromClassA = this._objectOfClassA.getSomething();
return returnValueFromClassA;
}
}
到目前為止我已經嘗試過:
import ....
import { mocked } from 'jest-mock';
jest.mock("./A", () => {
return {
A: jest.fn().mockImplementation(() => {
return {
getSomething: getSomethingMock
}
})
};
});
const getSomethingMock = jest.fn().mockImplementation(() => {
return "Mock value";
});
const mockA = mocked(A, true);
test("test functionofClassBToTest", () => {
const classBToTest = new B(mockA);
expect(classBToTest.functionofClassBToTest.toStrictEqual("Mock value");
});
這是我得到的錯誤:
TypeError: this._objectOfClassA.getSomething is not a function
注意:我不想在我的測驗函式中初始化 A 類的物件。我只想嘲笑課堂。
我還在 SO 上找到了一些以前的帖子:Post1和Post2但沒有任何效果。
更新:由于詹姆斯在下面的回答,這個問題得到了解決。對于帶有私人成員的模擬課程,我問了另一個SO Question。請務必閱讀。
uj5u.com熱心網友回復:
鑒于 Typescript 是結構化型別的,應該可以簡單地構造一個與 A 類的介面匹配的物件并將其傳遞給 B 類。
例如:
const mockA: jest.Mocked<A> = {
getSomething: jest.fn()
};
const b = new B(mockA);
expect(mockA.getSomething)
.toHaveBeenCalled();
鑒于 mockA 與類 A 的介面完全匹配,這不應該產生型別錯誤。
要模擬 A 的方法的回傳值,請參閱使用 Jest 模擬單個函式。
事實證明,這比試圖模擬整個模塊更簡單、更簡潔。由于您使用 IoC 作為模式,因此不需要模擬模塊。
你也有錯別字。B 類分配給一個只有一個下劃線的實體變數,然后呼叫一個帶有兩個下劃線的實體變數的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406780.html
標籤:
