我對 Pact-js 和合同測驗非常陌生,我會盡力解釋我的問題。現在,我只是想生成消費者合同
這是我的協議提供者:
export const provider = new Pact({
consumer: 'Users',
provider: 'UsersService',
port: 1234,
log: path.resolve(process.cwd(), 'logs', 'pact.log'),
pactfileWriteMode: 'overwrite',
logLevel: "DEBUG",
dir: path.resolve(process.cwd(), 'pacts'),
});
這是我的測驗:
jest.mock("axios");
const EXPECTED_BODY = {...}
describe("Pact tests axios", () => {
describe("/GET login", () => {
beforeAll(() => provider.setup());
afterEach(()=> provider.verify())
afterAll(() => provider.finalize());
it("should login user and response with user object", async () => {
await provider.addInteraction({
state: 'user logged', uponReceiving: 'request logged user', withRequest: {
method: 'GET',
path: '/users/login',
body: {username: "test", password: "11223344"},
}, willRespondWith: {
status: 200, headers: {
'Content-Type': 'application/json',
}, body: eachLike(EXPECTED_BODY),
},
});
axios.get.mockResolvedValueOnce(EXPECTED_BODY);
const loggedUser = await loginUser("test", "11223344")
expect(axios.get).toHaveBeenCalledTimes(1)
expect(axios.get).toHaveBeenLastCalledWith("http://localhost:8080/users/login", {"headers": {"Content-Type": "application/json"}, "params": {"password": "11223344", "username": "test"}})
expect(loggedUser).toEqual(EXPECTED_BODY)
})
});
})
我應該說我的原始請求帶有兩個引數username,password并回傳一個包含所有用戶資訊的物件,如果不回傳,用戶當然存在null
如果需要,這里是 API 呼叫函式:
export default async function loginUser(username, password) {
try{
return await axios.get(("http://localhost:8080/users/login"), {
headers: {
"Content-Type": "application/json"
},
params: {
username: username,
password: password
}
})
}catch (e){
return null
}
}
uj5u.com熱心網友回復:
Pact 期望您實際呼叫您在 Pact 中模擬的端點。
缺少請求:GET /users/login
這個錯誤說“你說你會GET打電話給/users/login但我沒有收到”。
jest.mock("axios");
這看起來像是在模擬 HTTP 客戶端 Axios。現在你有了一個需要向 Pact Mock 發送請求的東西的模擬。
在 Pact 測驗中,將其視為 API 客戶端代碼的單元測驗。實際請求需要發送到 Pact Mock,Pact 將檢查是否發出了正確的請求,并回傳模擬的回應。
所以解決方案很簡單:
- 洗掉所有的 axios 模擬
- 提供一種修改 API 目標的方法
loginUser - 在運行測驗之前配置您的 API 客戶端以發送請求
localhost:1234而不是真實的東西
(注意:您可以通過不設定選項來動態查找空閑埠port,并從setup()呼叫的回應中獲取主機)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493235.html
標籤:javascript 测试 axios 协议
上一篇:使用sklearn的cross_val_score和不同的訓練和測驗資料集
下一篇:Rails中的存根控制器方法
