اختبار الوحدة - استخدام نوع كقيمة في تايبسكريبت


أنا أستخدم inject-loader لمحاكاة التبعيات لمشروع Typescript يتم اختباره بوحدات. الخدمة التي أقوم باختبارها لديها سطر استيراد مثل هذا:

import pnp, { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

لاختباري، أرغب في محاكاة عدة وظائف في pnp، ولكن مع الحفاظ على الفئات سليمة. في ملف اختبار الوحدة الخاص بي، قمت بتضمين هذا الاستيراد:

import { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

مما يمنح اختباري الوصول إلى الفئات اللازمة. لقد قمت بإعلان كائن خدمة وهمية:

// mock services
const mockPnp = {
    default: { ... }
};

الذي أقوم بتوصيله إلى نسخة فئة الهدف الخاصة بي:

Service = require("inject!./sharepointservice")({
    "sp-pnp-js": mockPnp
}).Service;

وكل شيء يعمل، طالما لم أقم بتشغيل أي كود يستدعي تلك الفئات (أي SearchQuery). ولكي يعمل ذلك، حاولت إضافته إلى النموذج التجريبي:

// mock services
const mockPnp = {
    default: { ... },
    SearchQuery: SearchQuery
};

ومع ذلك، أحصل على خطأ 'SearchQuery' يشير فقط إلى نوع، لكنه يُستخدم هنا كقيمة.

لقد حاولت التحويل إلى any (نفس الخطأ)، وحيل مع الوحدات والتصديرات، دون أي جدوى. من المفترض أن أتمكن من كتابة أي جافا سكريبت باستخدام تايب سكريبت، وكان هذا سيعمل ببساطة في جافا سكريبت - ما الذي أفتقده هنا؟

الإجابة رقم 1

وفقًا لملف التعريف، تعتبر SearchQuery واجهة، مما يعني أنه لا يمكنك التعامل معها كقيمة (كما تقول رسالة الخطأ).

واجهات Typescript لا يتم تجميعها في ناتج js، ولا يمكنك استخدامها أثناء وقت التشغيل.