জেসমিনে কোনও ত্রুটি নিক্ষেপ হওয়ার প্রত্যাশা করে এমন একটি পরীক্ষা কীভাবে লিখবেন?


490

আমি জেসমিন টেস্ট ফ্রেমওয়ার্কের জন্য একটি পরীক্ষা লেখার চেষ্টা করছি যা কোনও ত্রুটি প্রত্যাশা করে। এই মুহুর্তে আমি গিটহাব থেকে জেসমিন নোড.জেএস ইন্টিগ্রেশন ব্যবহার করছি ।

আমার নোড মডিউলে আমার কাছে নিম্নলিখিত কোড রয়েছে:

throw new Error("Parsing is not possible");

এখন আমি একটি পরীক্ষা লিখতে চেষ্টা করি যা এই ত্রুটিটি আশা করে:

describe('my suite...', function() {
    [..]
    it('should not parse foo', function() {
    [..]
        expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
    });
});

আমি Error()এবং অন্যান্য কিছু রূপগুলিও চেষ্টা করেছিলাম এবং কীভাবে এটি কাজ করতে হয় তা ঠিক বুঝতে পারি না।


4
একটি বেনামী ফাংশন ব্যবহার না করেই প্রেরণ করার জন্য ফাংশন আর্গুমেন্ট পরীক্ষা করা হচ্ছে, চেষ্টা Function.bind: stackoverflow.com/a/13233194/294855
Danyal Aytekin

উত্তর:


802

আপনি expect(...)কল মধ্যে একটি ফাংশন পাস করা উচিত । আপনার এখানে কোডটি রয়েছে:

// incorrect:
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));

আসলে ফলাফলটি পাস করার প্রয়াসে ডাকার চেষ্টা করছে ,parser.parse(raw)expect(...)

পরিবর্তে একটি বেনামি ফাংশন ব্যবহার করে দেখুন:

expect( function(){ parser.parse(raw); } ).toThrow(new Error("Parsing is not possible"));

28
আপনার যদি যুক্তিগুলিও পাস করার প্রয়োজন না হয় তবে আপনি কেবল প্রত্যাশার জন্য ফাংশনটিও পাস করতে পারেন:expect(parser.parse).toThrow(...)
সাবমিডডিনিড

60
সহায়ক টিপ: আপনি কেবল কল করতে পারেন expect(blah).toThrow()। কোনও আর্গুমেন্টের অর্থ এটি একেবারে নিক্ষেপ করে তা পরীক্ষা করে দেখুন। কোনও স্ট্রিং ম্যাচিংয়ের প্রয়োজন নেই। আরও দেখুন: স্ট্যাকওভারফ্লো.com
জেস

1
আমার মতে, কোনও বেনামি কার্যক্রমে মোড়ানোর সময় পরীক্ষার অভিপ্রায় হিসাবে এটি আরও স্পষ্ট। এছাড়াও, এটি সমস্ত পরীক্ষার মধ্যেই সামঞ্জস্য বজায় থাকে যখন উদাহরণস্বরূপ, লক্ষ্য ছুঁড়ে ফেলার জন্য আপনাকে পরামিতিগুলি পাস করতে হবে।
বীজ

10
@ সাবমিটডেনিড: এটি সাধারণভাবে কাজ করে না! যদি parser.parseব্যবহার করা হয় this, প্রসঙ্গ ছাড়াই এটি পাস করা অপ্রত্যাশিত ফলাফল আনবে। আপনি পাস করতে পারেন parser.parse.bind(parser), তবে সত্যি বলতে ... একটি বেনামি ফাংশনটি আরও মার্জিত হবে।
12:16

2
@ ল্যানসকিন্ড নেক্রোকে দুঃখিত, তবে, আপনাকে কোনও ক্রিয়াকলাপটি পাস করার কারণটি হ'ল কোনও মূল্য মূল্যায়ন করা হবে এবং এটি প্রত্যাশার মধ্যে যাওয়ার আগেও একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে।
1g শ্রুতি

68

আপনি ব্যবহার করছেন:

expect(fn).toThrow(e)

তবে আপনার যদি ফাংশন মন্তব্যটিতে নজর থাকে (প্রত্যাশিত স্ট্রিং):

294 /**
295  * Matcher that checks that the expected exception was thrown by the actual.
296  *
297  * @param {String} expected
298  */
299 jasmine.Matchers.prototype.toThrow = function(expected) {

আমি মনে করি আপনার সম্ভবত এটি এইরকম লেখা উচিত (ল্যাম্বদা ব্যবহার করে - বেনামে ফাংশন):

expect(function() { parser.parse(raw); } ).toThrow("Parsing is not possible");

এটি নিম্নলিখিত উদাহরণে নিশ্চিত করা হয়েছে:

expect(function () {throw new Error("Parsing is not possible")}).toThrow("Parsing is not possible");

"নিক্ষেপ নতুন ত্রুটি ()" ব্যবহার না করে (প্রোটোটাইপিং উপায়) ডগলাস ক্রকফোর্ড দৃ approach়ভাবে এই পদ্ধতির সুপারিশ করেছেন:

throw {
   name: "Error",
   message: "Parsing is not possible"
}

3
প্রকৃতপক্ষে থ্রো কোডটির দিকে তাকিয়ে খুশি খুশি একটি ব্যতিক্রম বস্তু / বা / একটি স্ট্রিং নেবে। এটি কল করা কলগুলি পরীক্ষা করে দেখুন me উদাহরণস্বরূপ ম্যাসেজ।
পিট হজসন

1
স্ট্রিংয়ের কোনও বার্তা সম্পত্তি না থাকা স্ট্রিংয়ের পার্শ্ব প্রতিক্রিয়া হিসাবে এটি অনুমতি দেয়
এমপিপিস

1
অনেক কাজ যে ধন্যবাদ। আমি এখনও, পিট উত্তর গৃহীত beacuse তার উত্তর আমার কাছে আরও স্পষ্ট হয়েছে, আমি যে আছে একটি ল্যামডা ব্যবহার করতে। এখনও +1 :-) ধন্যবাদ!
ইকক্স

16
যদি আপনি কোনও ত্রুটির পরিবর্তে কোনও বস্তু নিক্ষেপ করেন (যেমন নীচে আপনার উদাহরণ হিসাবে), তবে আপনি ব্রাউজারগুলিতে স্ট্যাক ট্রেস পাবেন না যা এটি সমর্থন করে।
কিবারনেটিকোস

2
@ কেবারনেটিকোস আশ্চর্যজনকভাবে, সম্পূর্ণ সত্য নয়; আপনি যদি একটি অ- Error( jsfiddle.net/k1mxey8j ) ফেলে দেন তবে ক্রোম কনসোলে মুদ্রিত স্ট্যাক ট্রেস পাবেন । তবে, আপনার ফেলে দেওয়া অবজেক্টটিতে অবশ্যই .stackসম্পত্তি থাকবে না , যা আপনি যদি স্বয়ংক্রিয় ত্রুটি প্রতিবেদন সেট আপ করতে চান তবে তা গুরুত্বপূর্ণ হতে পারে ।
মার্ক আমেরিকা 14'15

24

বেনামি ফাংশন তৈরির চেয়ে আরও মার্জিত সমাধান যার একমাত্র উদ্দেশ্য অন্যটি মোড়ানো, এটি এস 5 এর bindফাংশনটি ব্যবহার করা । বাইন্ড ফাংশন একটি নতুন ফাংশন তৈরি করে, যখন ডাকা হয়, তার thisকীওয়ার্ডটি প্রদান করা মানটিতে সেট করে, যখন নতুন ফাংশন বলা হয় তখন সরবরাহিত পূর্ববর্তী যুক্তিগুলির একটি ক্রম সহ with

পরিবর্তে:

expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");

বিবেচনা:

expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");

বাইন্ড সিনট্যাক্স আপনাকে বিভিন্ন thisমান সহ ফাংশন পরীক্ষা করতে দেয় এবং আমার মতে পরীক্ষাটি আরও পাঠযোগ্য able আরও দেখুন: https://stackoverflow.com/a/13233194/1248889


23

আমি জেসমিনের ট্রো ম্যাচারের সাথে নিম্নলিখিতটি প্রতিস্থাপন করেছি, যা আপনাকে ব্যতিক্রমের নামের সম্পত্তি বা এর বার্তার সম্পত্তিতে মিলিয়ে দিতে দেয়। আমার জন্য এটি পরীক্ষাগুলি লিখতে সহজ করে এবং কম ভঙ্গুর করে তোলে, কারণ আমি নিম্নলিখিতগুলি করতে পারি:

throw {
   name: "NoActionProvided",
   message: "Please specify an 'action' property when configuring the action map."
}

এবং তারপরে নিম্নলিখিতটি দিয়ে পরীক্ষা করুন:

expect (function () {
   .. do something
}).toThrow ("NoActionProvided");

এটি আমাকে টেস্টগুলি না ভেঙে পরে ব্যতিক্রম বার্তাটি ঝাপটতে দেয়, যখন গুরুত্বপূর্ণ বিষয়টি এটি প্রত্যাশিত ধরণের ব্যতিক্রম ছুঁড়ে দেয়।

এটি টো ট্রোর প্রতিস্থাপন যা এটি এর অনুমতি দেয়:

jasmine.Matchers.prototype.toThrow = function(expected) {
  var result = false;
  var exception;
  if (typeof this.actual != 'function') {
    throw new Error('Actual is not a function');
  }
  try {
    this.actual();
  } catch (e) {
    exception = e;
  }
  if (exception) {
      result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected) || this.env.equals_(exception.name, expected));
  }

  var not = this.isNot ? "not " : "";

  this.message = function() {
    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
      return ["Expected function " + not + "to throw", expected ? expected.name || expected.message || expected : " an exception", ", but it threw", exception.name || exception.message || exception].join(' ');
    } else {
      return "Expected function to throw an exception.";
    }
  };

  return result;
};

4
একটি দুর্দান্ত পদ্ধতির তবে এটি {নাম: '...', বার্তা: '...' Java জাভাস্ক্রিপ্টে কোনও সঠিক ত্রুটি?
মার্ক 21

1
সুন্দর মন্তব্য @ মার্ক। আপনি ঠিক বলেছেন, নামের সম্পত্তিটি আদর্শ নয়। বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / ,, তবে কি এতটা ভুল?
জেস

4
@Jake! আমি একটি ভাল উপায় খুঁজে পেয়েছি !!!! আপনি কেবল কল করতে পারেন expect(blah).toThrow()। কোনও আর্গুমেন্টের অর্থ এটি একেবারে নিক্ষেপ করে তা পরীক্ষা করে দেখুন। কোনও স্ট্রিং ম্যাচিংয়ের প্রয়োজন নেই। আরও দেখুন: স্ট্যাকওভারফ্লো.com
জেস

5
থ্যাঙ্কস জেস - এটি সত্য, তবে তারপরে এটি টাইপআরারের মতো অন্য কোনও ত্রুটি ছুঁড়ে ফেলছে my
জেক

4
টু থ্রো () এর আর্গুমেন্ট হিসাবে আপনি এখন একটি রেজেক্সও ব্যবহার করতে পারেন।
টনি ও'হাগান

21

পূর্বে উল্লিখিত হিসাবে, একটি ফাংশনটি toThrowযেমন আপনার পরীক্ষায় বর্ণনা করা হচ্ছে তেমন ফাংশনটি পাস করতে হবে: "আমি আশা করি এই ফাংশনটি এক্স ফেলে দেবে"

expect(() => parser.parse(raw))
  .toThrow(new Error('Parsing is not possible'));

যদি জুঁই-ম্যাচার্স ব্যবহার করে থাকেন তবে যখন পরিস্থিতি অনুসারে আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন;

// I just want to know that an error was
// thrown and nothing more about it
expect(() => parser.parse(raw))
  .toThrowAnyError();

অথবা

// I just want to know that an error of 
// a given type was thrown and nothing more
expect(() => parser.parse(raw))
  .toThrowErrorOfType(TypeError);

3
এটি expect(foo).toThrowError(TypeError);জেসমিন 2.5 এ রয়েছে: jasmine.github.io/2.5/intr Productions
বেনি

9

আমি জানি যে এটি আরও কোড তবে আপনি এটি করতে পারেন:

try
   do something
   @fail Error("should send a Exception")
 catch e
   expect(e.name).toBe "BLA_ERROR"
   expect(e.message).toBe 'Message'

আমি এটির জন্য 'স্ব-ডকুমেন্টিং' দিকটি পছন্দ করি ... এটি খুব স্পষ্ট করে তোলে যে আপনি ইউনিট একটি ত্রুটি রাষ্ট্রের পরীক্ষা করছেন
জারুল


3

যে কেউ এখনও এই সমস্যার মুখোমুখি হতে পারে তার জন্য, আমার জন্য পোস্ট করা সমাধান কাজ করে না এবং এটি এই ত্রুটিটি ছুঁড়ে দিতে থাকে: Error: Expected function to throw an exception. আমি পরে বুঝতে পেরেছিলাম যে ফাংশনটি আমি ত্রুটি ছুঁড়ে ফেলার আশা করছিলাম এটি একটি অ্যাসিঙ্ক ফাংশন ছিল এবং প্রতিশ্রুতির প্রত্যাশা করছিল প্রত্যাখ্যান করা হবে এবং তারপরে ত্রুটি নিক্ষেপ করুন এবং এটিই আমি আমার কোডটিতে করছিলাম:

throw new Error('REQUEST ID NOT FOUND');

এবং আমার পরীক্ষায় আমি কী করেছি এবং তা কার্যকর হয়েছে:

it('Test should throw error if request not found', willResolve(() => {
         const promise = service.getRequestStatus('request-id');
                return expectToReject(promise).then((err) => {
                    expect(err.message).toEqual('REQUEST NOT FOUND');
                });
            }));

এর জন্য ধন্যবাদ. আমি খুব বিভ্রান্ত ছিলাম, তবে আপনার মন্তব্যটি সঠিকভাবে বোঝায়। আমি বিষয়টি নতুন ব্যবহার সংশোধন expectAsync jasmine.github.io/api/3.3/async-matchers.html
বেঞ্জামিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.