POST с multipart / form-data, используя супер-тест node.js - PullRequest
0 голосов
/ 19 октября 2019

Я пытался использовать супертест 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.

Когда я использую значение в качестве переменной, произошла эта ошибка.

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 ]

0 голосов
/ 20 октября 2019

userId - это new mongoose.Types.ObjectId(). Таким образом, он не возвращает строку, он возвращает объект. Вам нужно преобразовать его в строку. Мы можем использовать это. .field("userId", String(userId))

0 голосов
/ 19 октября 2019

Я могу интерпретировать это как 2 разных способа, поэтому я просто отвечу на оба:

Может ли значение быть указано как нестроковое, например, число.

multipart/form-data на самом деле не печатает. Все будет обычно интерпретироваться как строка. Ваш контроллер должен будет выполнить любое преобразование.

Могу ли я использовать переменную вместо жестко закодированной строки.

Да, вы можете.

Вместо:

.field("userId", "5d921d306e96d70a28989127")

Вы можете просто использовать:

.field("userId", userId)

Пока вы определили переменную userId ранее

...