صف الخلل
إذا كنت sinon.createStubInstance(X)
حيث X عبارة عن فصل به عضو خاص واحد على الأقل ، أتلقى أخطاء مثل:
حجة من نوع 'SinonStubbedInstance
'غير قابل للتخصيص لمُعامل من النوع "Foo".
الخاصية '_private' مفقودة في النوع 'SinonStubbedInstance"لكنها مطلوبة من النوع" Foo ".
describe('SinonTest', () => {
class Foo {
public talk() {
return 'hi';
}
private _private() {
return null;
}
}
function printSpeech(foo: Foo) {
console.log(foo.talk());
}
it('should allow you to pass a stub as a the original', () => {
const mockFoo = sinon.createStubInstance(Foo);
printSpeech(mockFoo);
});
});
لإعادة إنتاج
خطوات إعادة إنتاج السلوك:
printSpeech(mockFoo)
سلوك متوقع
أتوقع أن يعمل هذا بدون أخطاء. لا يهمني _private () ، ولا أنوي اختبار سلوكه بشكل مباشر ، ولكن لا ينبغي أن ينتج عنه خطأ في وقت الإنشاء. تدعم Jasmine هذه الحالة بـ jasmine.createSpyObj
، على الرغم من أن تطبيق الياسمين به عيوب أخرى.
السياق (يرجى استكمال المعلومات التالية):
البيئة: WSL Ubuntu 16.04 ، العقدة 10
المكتبات الأخرى التي تستخدمها: Mocha 5.2.0
تحرير: هذا ملف stackblitz https://stackblitz.com/edit/typescript-nfbgno؟file=index.ts
إنه يشتكي من process.stdout لأنه يعمل في المتصفح ، لكن هذا غير مهم لأن المشكلة الفعلية هي وقت التجميع
هذه قضية مطبوعة. لن نستغل الوقت في البحث في هذا الأمر ، لأننا لا ندعم "كتابة النص" بشكل صريح. هذا النوع من الأنواع يدعم بطريقة ما للأعضاء الخاصين هو خاصية من نوع النظام الخاص به ويمكن تنفيذه بعدد من الطرق. عندما استخدمت Typescript ، غالبًا ما كنت أقوم بحل مثل هذه المشكلات بالانتقال إلى ملعب Typescript وفحص الإخراج لفهم ما فعلته. هذا ما عليك القيام به أيضًا.
هذا ليس حلاً نهائيًا ، لكنني تمكنت من حل هذه المشكلة بالوظيفة التالية:
import { createStubInstance, StubbableType, SinonStubbedInstance, SinonStubbedMember } from 'sinon';
export type StubbedClass<T> = SinonStubbedInstance<T> & T;
export function createSinonStubInstance<T>(
constructor: StubbableType<T>,
overrides?: { [K in keyof T]?: SinonStubbedMember<T[K]> },
): StubbedClass<T> {
const stub = createStubInstance<T>(constructor, overrides);
return stub as unknown as StubbedClass<T>;
}
من الواضح أن هذا لا ينفذ أي طرق خاصة ، وعلى هذا النحو لا يمكنك (ولا ينبغي عليك حسب التصميم) تسميتها. باستخدام وظيفة التجميع هذه ، تحصل على إكمال التعليمات البرمجية لجميع الوظائف / الأعضاء العامة في صفك بالإضافة إلى وظائف مساعد sinon و StubbedClass
هل ما زالت إجابة pauloavelar هي الحل الموصى به؟
التعليق الأكثر فائدة
هذا ليس حلاً نهائيًا ، لكنني تمكنت من حل هذه المشكلة بالوظيفة التالية:
من الواضح أن هذا لا ينفذ أي طرق خاصة ، وعلى هذا النحو لا يمكنك (ولا ينبغي عليك حسب التصميم) تسميتها. باستخدام وظيفة التجميع هذه ، تحصل على إكمال التعليمات البرمجية لجميع الوظائف / الأعضاء العامة في صفك بالإضافة إلى وظائف مساعد sinon و StubbedClassهو نوع صالح لاستخدامه كـ T في اختباراتك.