XUnit ব্যবহার করে একটি ব্যতিক্রম যুক্ত করুন


111

আমি এক্স ইউনিত এবং মকের একজন নবাগত। আমার একটি পদ্ধতি রয়েছে যা আর্গুমেন্ট হিসাবে স্ট্রিং নেয় takes XUnit ব্যবহার করে কীভাবে একটি ব্যতিক্রম পরিচালনা করবেন।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() {
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    //act
    var result = profiles.GetSettingsForUserID("");
    //assert
    //The below statement is not working as expected.
    Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));
}

পরীক্ষা অধীনে পদ্ধতি

public IEnumerable<Setting> GetSettingsForUserID(string userid)
{            
    if (string.IsNullOrWhiteSpace(userid)) throw new ArgumentException("User Id Cannot be null");
    var s = profiles.Where(e => e.UserID == userid).SelectMany(e => e.Settings);
    return s;
}

1
"প্রত্যাশার মতো কাজ করছে না" বলতে কী বোঝ? (এছাড়াও, দয়া করে আপনার কোডটি আরও স্বাচ্ছন্দ্যে ফর্ম্যাট করুন preview পূর্বরূপটি ব্যবহার করুন এবং আপনি এটি পড়ছেন কিনা তা আপনি কীভাবে দেখতে চান তা পোস্ট করুন))
জোন স্কিট

4
ইঙ্গিত: আপনি কল করা GetSettingsForUserID("")শুরু করার আগে কল করছেন Assert.ThrowsAssert.Throwsকল তুমি সেখানে সাহায্য করতে পারবে না। আমি এএএ সম্পর্কে কম অনড় থাকার পরামর্শ দিই ...
জন স্কিটি

উত্তর:


183

Assert.Throws অভিব্যক্তি ব্যতিক্রম ধরা ও টাইপ জাহির হবে। তবে আপনি দৃsert়তা প্রকাশের বাইরে পরীক্ষার অধীনে পদ্ধতিটিকে কল করছেন এবং এভাবে পরীক্ষার ক্ষেত্রে ব্যর্থ।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException()
{
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    // act & assert
    Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));
}

যদি এএএ অনুসরণ করতে বাঁকানো হয় তবে আপনি নিজের ভেরিয়েবলের মধ্যে ক্রিয়াটি বের করতে পারেন।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException()
{
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    //act
    Action act = () => profiles.GetSettingsForUserID("");
    //assert
    var exception = Assert.Throws<ArgumentException>(act);
    //The thrown exception can be used for even more detailed assertions.
    Assert.Equal("expected error message here", exception.Message);
}

মোড বিশদ প্রতিবেদনের জন্য কীভাবে ব্যতিক্রম ব্যবহার করা যেতে পারে তা নোট করুন


5
যদি অ্যাসিঙ্ক পদ্ধতি ব্যবহার করা হয় তবে ভিজ্যুয়াল স্টুডিও উপরের সিনট্যাক্স সহ একটি সতর্কতা নিক্ষেপ করছে। এটি এটি পছন্দ করে:async Task act() => await service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
এলেক

5
আসলে আমার জন্য যার ফলে একটি ত্রুটি হয়েছিল, 'স্পষ্টতভাবে টাস্ককে ফানক <টাস্ক> এ রূপান্তর করতে পারে না', যদিও আমি যদি এখনই রাখি Task act() => service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);তবে এটি এতে খুশি এবং ঠিকঠাক কাজ করে।
এলেক

কীভাবে অ্যাসিঙ্কের সাথে কাজ করা / এটির জন্য অপেক্ষা করে? আমি যখন আমার পরীক্ষায় থ্রোস-সিঙ্ক ব্যবহার করে এটি করার চেষ্টা করি তখন এটি কখনও আসক্তের কাছে পৌঁছায় না qu জলের পরীক্ষা করে দেখা হচ্ছে এটি কী নতুন প্রশ্ন হওয়া উচিত ...
নাথানজউ

অ্যালেকডেনহোম ধন্যবাদ! এটাই আমার পক্ষে কাজ করেছে। আমি মনে করি অন্যান্য কিছু পরামর্শ অ্যাসিঙ্ক স্টাফের জন্য সত্যই সঠিকভাবে কাজ করে না।
ট্রেডমার্ক

45

আপনি যদি এএএ সম্পর্কে কঠোর হতে চান তবে আপনি আপনার আইন পর্যায়ে ব্যতিক্রম ক্যাপচারের জন্য xUnit থেকে রেকর্ড.এক্সেপশন ব্যবহার করতে পারেন ।

তারপরে আপনি আসরেট স্টেজের ক্যাপচার করা ব্যতিক্রমের ভিত্তিতে দৃser়তা তৈরি করতে পারেন।

XUnits পরীক্ষায় এর উদাহরণ দেখা যায় ।

[Fact]
public void Exception()
{
    Action testCode = () => { throw new InvalidOperationException(); };

    var ex = Record.Exception(testCode);

    Assert.NotNull(ex);
    Assert.IsType<InvalidOperationException>(ex);
}

আপনি কোন পথটি অনুসরণ করতে চান তা আপনার উপর নির্ভর করে এবং xUnit সরবরাহ করে উভয় পাথই সম্পূর্ণ সমর্থনযোগ্য।


1
এফডব্লিউআইডাব্লু, আপনার সম্ভবত ব্যতিক্রম বার্তা, ইত্যাদি যাচাই করতে হবে তবে এই সমাধানটি দুর্দান্ত I আমি মনে করি এটি তখনই আপনি রেকর্ড ব্যবহার করতে পারেন x এক্সসেপশন।
জেফ লাফে

@ জেফএলএফএ আমি প্রশংসা করি যে আমি এখানে পার্টিতে কিছুটা দেরি করেছি, কীভাবে এটি ব্যবহার var exception = Assert.Throws<InvalidOperationException>(testCode);এবং জোর দেওয়া থেকে আলাদা হবে exception.Message? বা এটি একই জিনিস অর্জনের অন্য এক স্বাদ?
কলিনম

3

আপনি যদি এএএতে লেগে থাকতে চান তবে আপনি এই জাতীয় কিছু বিবেচনা করতে পারেন:

// Act 
Task act() => handler.Handle(request);

// Assert
await Assert.ThrowsAsync<MyExpectedException>(act);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.