Sinon: لا يمكن إنشاء StubInstance في فصل دراسي بأعضاء خاصين

تم إنشاؤها على ٤ يناير ٢٠١٩  ·  3تعليقات  ·  مصدر: sinonjs/sinon

صف الخلل
إذا كنت 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);
  });
});

لإعادة إنتاج
خطوات إعادة إنتاج السلوك:

  1. قم بإعداد مشروع مع المخاوي والسينون.
  2. قم بإنشاء ملف مواصفات اختبار الوحدة
  3. الصق مقتطف الشفرة أعلاه وأضف أي عمليات استيراد مطلوبة
  4. رؤية الخطأ على السطر مع printSpeech(mockFoo)

سلوك متوقع
أتوقع أن يعمل هذا بدون أخطاء. لا يهمني _private () ، ولا أنوي اختبار سلوكه بشكل مباشر ، ولكن لا ينبغي أن ينتج عنه خطأ في وقت الإنشاء. تدعم Jasmine هذه الحالة بـ jasmine.createSpyObj ، على الرغم من أن تطبيق الياسمين به عيوب أخرى.

السياق (يرجى استكمال المعلومات التالية):

  • إصدار المكتبة: sinon: 7.2.2، @ types / sinon: 7.0.3
  • البيئة: WSL Ubuntu 16.04 ، العقدة 10

  • المكتبات الأخرى التي تستخدمها: Mocha 5.2.0

تحرير: هذا ملف stackblitz https://stackblitz.com/edit/typescript-nfbgno؟file=index.ts

إنه يشتكي من process.stdout لأنه يعمل في المتصفح ، لكن هذا غير مهم لأن المشكلة الفعلية هي وقت التجميع

التعليق الأكثر فائدة

هذا ليس حلاً نهائيًا ، لكنني تمكنت من حل هذه المشكلة بالوظيفة التالية:

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هو نوع صالح لاستخدامه كـ T في اختباراتك.

ال 3 كومينتر

هذه قضية مطبوعة. لن نستغل الوقت في البحث في هذا الأمر ، لأننا لا ندعم "كتابة النص" بشكل صريح. هذا النوع من الأنواع يدعم بطريقة ما للأعضاء الخاصين هو خاصية من نوع النظام الخاص به ويمكن تنفيذه بعدد من الطرق. عندما استخدمت 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هو نوع صالح لاستخدامه كـ T في اختباراتك.

هل ما زالت إجابة pauloavelar هي الحل الموصى به؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات