POST 与 multipart/form-data 使用 node.js 超级测试
POST with multipart/form-data using node.js supertest
我试图使用 Node.js 超级测试来测试一些 REST API。
request(app)
.post("/products")
.set(
"Authorization",
"Bearer my jwt token here"
)
.set("Content-Type", "multipart/form-data")
.field("name", "Tomato")
.field("userId", "5d921d306e96d70a28989127")
.attach(
"productImage",
"D:/NodeJS/node-rest-shop/uploads/1558612339690managing-redis.jpg"
)
.expect(201)
.then(res => {
const body = res.body;
expect(body).to.contain.property("message");
expect(body).to.contain.property("productId");
expect(body).to.contain.property("date");
expect(body).to.contain.property("user");
expect(body).to.contain.property("request");
done();
})
.catch(err => done(err));
.field("userId", userId)
有什么方法可以在不设置硬编码字符串值的情况下将 userId 的值设置为变量?它是一个 MongoDB 对象 ID。
当我将值用作变量时发生此错误。
TypeError: source.on is not a function
at Function.DelayedStream.create (node_modules\delayed-stream\lib\delayed_stream.js:33:10)
at FormData.CombinedStream.append (node_modules\combined-stream\lib\combined_stream.js:45:37)
at FormData.append (node_modules\form-data\lib\form_data.js:74:3)
at Test.RequestBase.field (node_modules\superagent\lib\request-base.js:406:23)
at Context.done (test\api\product\product.js:77:8)
我可以将其解释为 2 种不同的方式,所以我将同时回答:
Can the value be specified as a non-string, e.g. a number.
multipart/form-data
真的没有任何类型的打字。通常,一切都会被解释为字符串。您的控制器将需要进行任何转换。
Can I use a variable in place of a hardcoded string.
是的,你可以。
而不是:
.field("userId", "5d921d306e96d70a28989127")
您可以只使用:
.field("userId", userId)
只要你之前定义了一个userId变量
userId 是 new mongoose.Types.ObjectId()
。所以,它不是 return 一个字符串,它 return 是一个对象。您需要将其转换为字符串。
我们可以用这个。
.field("userId", String(userId))
我试图使用 Node.js 超级测试来测试一些 REST API。
request(app)
.post("/products")
.set(
"Authorization",
"Bearer my jwt token here"
)
.set("Content-Type", "multipart/form-data")
.field("name", "Tomato")
.field("userId", "5d921d306e96d70a28989127")
.attach(
"productImage",
"D:/NodeJS/node-rest-shop/uploads/1558612339690managing-redis.jpg"
)
.expect(201)
.then(res => {
const body = res.body;
expect(body).to.contain.property("message");
expect(body).to.contain.property("productId");
expect(body).to.contain.property("date");
expect(body).to.contain.property("user");
expect(body).to.contain.property("request");
done();
})
.catch(err => done(err));
.field("userId", userId)
有什么方法可以在不设置硬编码字符串值的情况下将 userId 的值设置为变量?它是一个 MongoDB 对象 ID。
当我将值用作变量时发生此错误。
TypeError: source.on is not a function
at Function.DelayedStream.create (node_modules\delayed-stream\lib\delayed_stream.js:33:10)
at FormData.CombinedStream.append (node_modules\combined-stream\lib\combined_stream.js:45:37)
at FormData.append (node_modules\form-data\lib\form_data.js:74:3)
at Test.RequestBase.field (node_modules\superagent\lib\request-base.js:406:23)
at Context.done (test\api\product\product.js:77:8)
我可以将其解释为 2 种不同的方式,所以我将同时回答:
Can the value be specified as a non-string, e.g. a number.
multipart/form-data
真的没有任何类型的打字。通常,一切都会被解释为字符串。您的控制器将需要进行任何转换。
Can I use a variable in place of a hardcoded string.
是的,你可以。
而不是:
.field("userId", "5d921d306e96d70a28989127")
您可以只使用:
.field("userId", userId)
只要你之前定义了一个userId变量
userId 是 new mongoose.Types.ObjectId()
。所以,它不是 return 一个字符串,它 return 是一个对象。您需要将其转换为字符串。
我们可以用这个。
.field("userId", String(userId))