การทดสอบหน่วยเชิงมุม 2: ไม่พบชื่อ 'อธิบาย'


213

ฉันกำลังติดตามการสอนนี้จาก angular.io

ดังที่พวกเขากล่าวว่าฉันได้สร้างไฟล์ hero.spec.ts เพื่อสร้างการทดสอบหน่วย:

import { Hero } from './hero';
describe('Hero', () => {
  it('has name', () => {
    let hero: Hero = {id: 1, name: 'Super Cat'};
    expect(hero.name).toEqual('Super Cat');
  });
  it('has id', () => {
    let hero: Hero = {id: 1, name: 'Super Cat'};
    expect(hero.id).toEqual(1);
  });
});

การทดสอบหน่วยทำงานเหมือนมีเสน่ห์ ปัญหาคือ: ฉันเห็นข้อผิดพลาดบางอย่างซึ่งกล่าวถึงในการกวดวิชา:

บรรณาธิการและผู้เรียบเรียงของเราอาจบ่นว่าพวกเขาไม่รู้อะไรit และexpectเป็นเพราะพวกเขาไม่มีไฟล์การพิมพ์ที่อธิบายจัสมิน เราสามารถเพิกเฉยต่อข้อร้องเรียนที่น่ารำคาญเหล่านี้ได้ในขณะนี้เนื่องจากไม่เป็นอันตราย

และพวกเขาก็เพิกเฉยต่อมันอย่างแน่นอน แม้ว่าข้อผิดพลาดเหล่านั้นจะไม่เป็นอันตราย แต่ก็ไม่ได้ดูดีในคอนโซลเอาท์พุทของฉันเมื่อฉันได้รับกลุ่ม

ตัวอย่างของสิ่งที่ฉันได้รับ:

ไม่พบชื่อ 'บรรยาย'

ไม่พบชื่อ 'มัน'

ไม่พบชื่อ 'คาดหวัง'

ฉันจะแก้ไขได้อย่างไร


คุณสามารถโหวตได้ที่ Github เพื่อแก้ไขข้อผิดพลาดนี้: github.com/TypeStrong/atom-typescript/issues/1125
Lucas Cimon

คำตอบ:


386

ฉันหวังว่าคุณจะติดตั้ง -

npm install --save-dev @types/jasmine

จากนั้นนำเข้าดังต่อไปนี้ที่ด้านบนของhero.spec.tsไฟล์ -

import 'jasmine';

มันควรจะแก้ปัญหา


3
คุณอาจต้องติดตั้งเวอร์ชันก่อนหน้าขึ้นอยู่กับรุ่นของ typescript ที่ต้องการ เช่นสำหรับ v2.2.1 ไอออนิกที่ฉันกำลังใช้ใช้ typescript v2.0.9 @types/jasmine@2.5.41ว่าผมจำเป็นต้องมีการติดตั้ง มิฉะนั้นคุณอาจจะเห็นข้อผิดพลาดเหล่านี้สะสม
โทนี่โอฮาแกน

18
คุณสามารถนำเข้าโมดูลสำหรับผลข้างเคียงของมัน:import 'jasmine';
camolin3

8
สิ่งที่ไม่import {} from 'jasmine';จริงทำอย่างไร มันเหมือนกันimport 'jasmine'ไหม?
TetraDev

2
ในแองกูลา 6.0.3: ฉันเพิ่งนำเข้า "นำเข้า {} จากดอกมะลิ" และใช้งานได้อีกครั้ง
Eduardo Cordeiro

2
@aesede คุณใช้ PS รุ่นใด ฉันเพิ่งรันคำสั่งโดยไม่ใส่เครื่องหมายคำพูดใด ๆ และมันก็เป็นไปด้วยดี
Konrad Viltersten

162

ด้วย Typescript@2.0 หรือใหม่กว่าคุณสามารถติดตั้งประเภทต่างๆด้วย:

npm install -D @types/jasmine

จากนั้นนำเข้าชนิดโดยอัตโนมัติโดยใช้typesตัวเลือกในtsconfig.json:

"types": ["jasmine"],

การแก้ปัญหานี้ไม่จำเป็นต้องมีimport {} from 'jasmine';ในแต่ละไฟล์ข้อมูลจำเพาะ


9
สำหรับ TypeScript docs สำหรับ tsconfig.json (v2.1 ในขณะนี้) ไม่จำเป็นต้องเพิ่ม"types": ["jasmine"]บรรทัดอีกต่อไป "โดยค่าเริ่มต้นแพ็คเกจ" @types "ที่มองเห็นได้ทั้งหมดจะรวมอยู่ในการรวบรวมของคุณแพคเกจในประเภท node_modules / @ ของโฟลเดอร์ที่ปิดล้อมใด ๆ จะถูกพิจารณาว่ามองเห็นได้โดยเฉพาะนั่นหมายถึงแพคเกจภายใน ประเภท /, ../../node_modules/@types/ เป็นต้น "
bholben

12
@holben ฉันรู้ แต่ด้วยเหตุผลบางอย่างnodeและjasmineประเภทไม่ได้ตรวจพบ อย่างน้อยมันก็ไม่ได้ผลสำหรับฉันและฉันใช้ Typescript@2.1.5
Jiayi Hu

2
วิธีแก้ปัญหานี้ใช้ไม่ได้กับฉัน :( ขอโทษฉันใช้ang-app/e2e/tsconfig.jsonแล้ว ฉันลองใช้ในทุกระดับ jsonคุณช่วยกรุณาเพิ่มรายละเอียดเพิ่มเติมได้ไหม?
Sergii

สิ่งนี้จะไม่ทำงานเมื่อใช้ webpack - ในกรณีนี้ต้องให้บริการห้องสมุดจริง - การนำเข้า {} จาก 'jasmine' จะผลักห้องสมุดผ่าน
Bogdan

สิ่งนี้ใช้งานได้สำหรับฉัน แต่ฉันก็ต้องอัพเกรดเครื่อง
พิมพ์ดีด

27
npm install @types/jasmine

ตามที่ระบุไว้ในความคิดเห็นบางอย่าง"types": ["jasmine"]ไม่จำเป็นอีกต่อไป@typesแพคเกจทั้งหมดจะรวมอยู่ในการรวบรวมโดยอัตโนมัติ (ตั้งแต่ v2.1 ฉันคิดว่า)

ในความคิดของฉันทางออกที่ง่ายที่สุดคือการแยกไฟล์ทดสอบในtsconfig.jsonของคุณเช่น:

"exclude": [
    "node_modules",
    "**/*.spec.ts"
]

มันใช้งานได้สำหรับฉัน

ข้อมูลเพิ่มเติมอย่างเป็นทางการในเอกสาร TSconfig


3
เพียงหมายเหตุ: โครงการเชิงมุมใหม่มีsrc/tsconfig.app.json, และsrc/tsconfig.spec.json tsconfig.jsonส่วน "แยก" ที่กล่าวถึงเป็นส่วนหนึ่งของส่วนที่ 1 "types": [ "jasmine" ]ส่วนหนึ่งของ 2nd
Martin Schneider

2
โปรดทราบว่าในรหัส VS คุณสูญเสียความสามารถในการค้นหาการอ้างอิงในไฟล์ข้อมูลจำเพาะของคุณเนื่องจากจะไม่ถูกพิจารณาว่าเป็นส่วนหนึ่งของโครงการ
mleu

@mleu ฉันกำลังประสบปัญหาเดียวกัน คุณแก้ไขปัญหานี้ได้อย่างไร ทุกครั้งที่เขียนกรณีทดสอบฉันต้องลบรูปแบบไฟล์ข้อมูลจำเพาะออกจากexcludeบล็อก
Shishir Anshuman

@ShishirAnshuman: ฉันไม่พบวิธีแก้ปัญหาและต้องใช้ชีวิตด้วยข้อ จำกัด นี้จนกว่าโครงการจะจบลง
mleu

@mleu โอ้ ไม่มีปัญหา ในโครงการของฉันเป็นวิธีแก้ปัญหาฉันลบรูปแบบไฟล์ข้อมูลจำเพาะออกจากexcludeบล็อกของ tsconfig จากนั้นฉันสร้างtsconfig.build.jsonไฟล์ใหม่โดยเพิ่มรูปแบบไฟล์ข้อมูลจำเพาะลงในexcludeบล็อก ตอนนี้ฉันts-loaderตัวเลือก (ใน webpack.config) tsconfig.build.jsonที่ฉันใช้ ด้วยการกำหนดค่าเหล่านี้โมดูลจะถูกแก้ไขในไฟล์ทดสอบและในขณะที่สร้างการสร้างหรือการเริ่มต้นเซิร์ฟเวอร์ไฟล์ทดสอบจะถูกแยกออก
Shishir Anshuman

13

คุณต้องติดตั้งแบบอักษรสำหรับดอกมะลิ สมมติว่าคุณอยู่ใน typescript 2 รุ่นล่าสุดที่คุณควรทำ:

npm install --save-dev @types/jasmine

8

ด้วย Typescript@2.0 หรือใหม่กว่าคุณสามารถติดตั้งประเภทด้วยการติดตั้ง npm

npm install --save-dev @types/jasmine

จากนั้นอิมพอร์ตชนิดโดยอัตโนมัติโดยใช้อ็อพชัน typeRootsใน tsconfig.json

"typeRoots": [
      "node_modules/@types"
    ],

โซลูชันนี้ไม่ต้องการการนำเข้า {} จาก 'jasmine'; ในแต่ละไฟล์ข้อมูลจำเพาะ


1
น่าเสียดายที่มันใช้ไม่ได้ มันยังคงแสดงข้อผิดพลาดในไฟล์ข้อมูลจำเพาะ
dave0688

3

การแก้ไขปัญหานี้เชื่อมโยงกับสิ่งที่@Pace เขียนไว้ในคำตอบของเขา อย่างไรก็ตามมันไม่ได้อธิบายทุกอย่างดังนั้นถ้าคุณไม่รังเกียจฉันจะเขียนเอง

สารละลาย:

เพิ่มบรรทัดนี้:

///<reference path="./../../../typings/globals/jasmine/index.d.ts"/>

ที่จุดเริ่มต้นของhero.spec.tsปัญหาการแก้ไขไฟล์ เส้นทางนำไปสู่typingsโฟลเดอร์ (ที่จัดเก็บการพิมพ์ทั้งหมด)

ในการติดตั้งการพิมพ์คุณจำเป็นต้องสร้างtypings.jsonไฟล์ในรูทของโปรเจคของคุณด้วยเนื้อหาดังต่อไปนี้:

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160807145350"
  }
}

และเรียกใช้typings install( typingsแพคเกจ NPM อยู่ที่ไหน)


3
นี่เป็นวิธีที่ไม่ได้มาตรฐานในการทำเช่นนี้ กฎ tslint เริ่มต้นจะป้องกันเส้นทางอ้างอิง ใช้ไฟล์ tsconfig เพื่อชี้ไปที่ node_modules
FlavourScape

3

ในกรณีของการแก้ปัญหาคือการลบในของฉันtypeRootstsconfig.json

ตามที่คุณสามารถอ่านได้ในTypeScript doc

หากระบุ typeRoots จะมีเฉพาะแพ็คเกจภายใต้ typeRoots เท่านั้น


3

ฉันเป็นรุ่นล่าสุดจนถึงทุกวันนี้และพบว่าวิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือการไม่ทำอะไรเลย ... ไม่typeRootsไม่typesไม่excludeไม่มีincludeค่าเริ่มต้นทั้งหมดที่ดูเหมือนจะใช้ได้ดี ที่จริงแล้วมันไม่ได้ผลสำหรับฉันจนกว่าฉันจะลบพวกเขาทั้งหมด ฉันมี:

"exclude": [
    "node_modules"
]

แต่นั่นเป็นค่าเริ่มต้นดังนั้นฉันจึงลบมันออก

ฉันมี:

"types": [
    "node"
]

เพื่อผ่านการเตือนคอมไพเลอร์ แต่ตอนนี้ฉันก็ลบมันเช่นกัน

คำเตือนที่ไม่ควรเป็นคือ: error TS2304: Cannot find name 'AsyncIterable'. จากnode_modules\@types\graphql\subscription\subscribe.d.ts

ซึ่งน่ารังเกียจมากดังนั้นฉันทำเช่นนี้ใน tsconfig เพื่อที่จะโหลดมัน:

"compilerOptions": {
    "target": "esnext",
}

เนื่องจากมันอยู่ในชุด esnext ฉันไม่ได้ใช้งานโดยตรงดังนั้นจึงไม่ต้องกังวลเกี่ยวกับความเข้ากันได้ที่นี่ หวังว่าจะไม่เผาฉันในภายหลัง


คุณไม่จำเป็นต้องเพิ่ม"types": ["node"]ในtsconfig.jsonแต่คุณควรเพิ่มชนิดนี้tsconfig.app.json! คุณไม่ควรมีคำเตือนนี้อีกแล้วฉันคิดว่า คุณสามารถรักษา"target": "es5"หรือ"target": "es6"ตอนนี้
Christophe Chevalier

2

ต้องทำสิ่งต่อไปนี้เพื่อรับ @types ในLerna Mono-repo ที่มี node_modules หลายตัวเท่านั้น

npm install -D @types/jasmine

จากนั้นในแต่ละ tsconfig.file ของแต่ละโมดูลหรือแอพ

"typeRoots": [
  "node_modules/@types",
  "../../node_modules/@types" <-- I added this line
],

ตามค่าเริ่มต้นแพ็คเกจ "@types" ที่มองเห็นได้ทั้งหมดจะรวมอยู่ในการรวบรวมของคุณ แพ็กเกจในรูปแบบ node_modules / @ ของโฟลเดอร์ล้อมรอบใด ๆ จะถูกมองเห็นได้ โดยเฉพาะนั่นหมายถึงแพคเกจภายใน ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ และอื่น ๆ ดูเอกสารอย่างเป็นทางการ
Christophe Chevalier

1

เพื่อให้ TypeScript คอมไพเลอร์ใช้นิยามประเภทที่มองเห็นได้ทั้งหมดในระหว่างการรวบรวมtypesตัวเลือกควรถูกลบออกอย่างสมบูรณ์จากcompilerOptionsสนามในtsconfig.jsonไฟล์

ปัญหานี้เกิดขึ้นเมื่อมีtypesรายการบางรายการในcompilerOptionsฟิลด์ที่รายการในเวลาเดียวกันjestหายไป

ดังนั้นเพื่อแก้ไขปัญหาcompilerOptionsฟิลด์ในtscongfig.jsonควรรวมjestอยู่ในtypesพื้นที่หรือกำจัดtypescomnpletely:

{
  "compilerOptions": {
    "esModuleInterop": true,
    "target": "es6",
    "module": "commonjs",
    "outDir": "dist",
    "types": ["reflect-metadata", "jest"],  //<--  add jest or remove completely
    "moduleResolution": "node",
    "sourceMap": true
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

นี้ทำงานสำหรับฉันฉันมีgoogle map typesในtypesตัวเลือก หลังจากลบตัวเลือกอย่างสมบูรณ์แล้วก็ใช้งานได้ดี
pritesh agrawal

1

ฉันจะเพิ่มคำตอบสำหรับสิ่งที่ได้ผลสำหรับฉันใน "typescript": "3.2.4" ฉันรู้ว่าดอกมะลิใน node_modules / @ type มีโฟลเดอร์สำหรับ ts3.1 ภายใต้ประเภทดอกมะลิดังนั้นนี่คือขั้นตอน: -

  • ติดตั้งจัสมินประเภท npm install -D @types/jasmine
  • เพิ่มไปยัง tsconfig.json jasmine / ts3.1

    "typeRoots": [ ... "./node_modules/jasmine/ts3.1" ],

  • เพิ่มจัสมินกับประเภท

    "types": [ "jasmine", "node" ],

หมายเหตุ:ไม่จำเป็นสำหรับสิ่งนี้import 'jasmine';อีกต่อไป


1

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เมื่อฉันให้บริการแอพไม่ใช่เมื่อทำการทดสอบ ฉันไม่ทราบว่ามีการตั้งค่าที่แตกต่างกันในไฟล์ tsconfig.app.json ของฉัน

ฉันเคยมีสิ่งนี้:

{
  ...
  "include": [
    "src/**/*.ts"
  ]
}

มันรวม.spec.tsไฟล์ทั้งหมดของฉันเมื่อแสดงแอพ ฉันเปลี่ยนการinclude property toยกเว้นและเพิ่ม regex เพื่อแยกไฟล์ทดสอบทั้งหมดเช่นนี้:

{
  ...
  "exclude": [
    "**/*.spec.ts",
    "**/__mocks__"
  ]
}

ตอนนี้มันทำงานได้ตามที่คาดไว้


0

ดูการนำเข้าบางทีคุณอาจมีการพึ่งพาวงจรนี่คือในกรณีของฉันข้อผิดพลาดการใช้import {} from 'jasmine';จะแก้ไขข้อผิดพลาดในคอนโซลและทำให้รหัส compilable แต่ไม่เอารากของปีศาจ (ในกรณีของฉันขึ้นอยู่กับวงจร)


0

ฉันใช้ Angular 6, Typescript 2.7 และฉันใช้กรอบ Jest เพื่อทดสอบหน่วย ฉันได้@types/jestติดตั้งและเพิ่มไว้typeRootsภายในtsconfig.json

แต่ก็ยังมีข้อผิดพลาดการแสดงด้านล่าง (เช่น: บน terminal ไม่มีข้อผิดพลาด)

ไม่พบชื่ออธิบาย

และเพิ่มการนำเข้า:

import {} from 'jest'; // in my case or jasmine if you're using jasmine

ในทางเทคนิคไม่ได้ทำอะไรเลยฉันคิดว่ามีการนำเข้าที่ไหนสักแห่งที่ทำให้เกิดปัญหานี้แล้วฉันก็พบว่าถ้าลบไฟล์

tsconfig.spec.json

ใน src/โฟลเดอร์แก้ปัญหาให้ฉัน ในฐานะที่เป็น @types จะถูกนำเข้ามาก่อนภายใน rootTypes

ฉันแนะนำให้คุณทำเช่นเดียวกันและลบไฟล์นี้ไม่จำเป็นต้องมีการกำหนดค่าภายใน (ps: หากคุณอยู่ในกรณีเดียวกับฉัน)


0

หากข้อผิดพลาดอยู่ในไฟล์. specs app / app.component.spec.ts (7,3): ข้อผิดพลาด TS2304: ไม่พบชื่อ 'beforeEach'

เพิ่มสิ่งนี้ไปที่ด้านบนของไฟล์ของคุณและติดตั้ง npm rxjs

นำเข้า {range} จาก 'rxjs'; นำเข้า {map, filter} จาก 'rxjs / โอเปอเรเตอร์';

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.