Moq Expected: But was: no exception thrown










0















I have a Unit test function which worked. When I incorporated ILogger and Moq framework, its not catching exceptions anymore. See Last test below. In debugging the unit test step by step, I know the Exception is thrown. So not sure why its not displaying in Nunit and causing an error.



Error:



Message: Expected: <System.ArgumentException> But was: no exception thrown



using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;

namespace ElectronicsStore.Service

public class ParseVendorSupply

private readonly ILogger _logger;

public ParseVendorSupply(ILogger logger)

_logger = logger;


public VendorSupply FromCsv(string csvLine)

VendorSupply vendorsupply = new VendorSupply();

try

string values = csvLine.Split(',');
if (values.Length > 3)

throw new System.ArgumentException("Too much data");


vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);

catch (Exception)

_logger.LogInformation("An exception was thrown attempting");

return vendorsupply;





NUnit Test:



public class ParseVendorSupplyNunit
{

ILogger logger;

// This Works
[Test]
public void FromCsv_ParseCorrectly()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3";
VendorSupply vendorsupply = parseVendorSupply.FromCsv(csvLineTest);
Assert.AreEqual(5, vendorsupply.VendorId);
Assert.AreEqual(8, vendorsupply.ProductId);
Assert.AreEqual(3, vendorsupply.Quantity);


// This does not work anymore,after adding ILogger and Moq
[Test]
public void FromCsv_ParseCorrectly_Extradata()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);

string csvLineTest = "5,8,3,9,5";

Assert.That(() => parseVendorSupply.FromCsv(csvLineTest), Throws.ArgumentException);


Message: Expected: <System.ArgumentException> But was: no exception thrown









share|improve this question

















  • 1





    What does catch (Exception) do?

    – mjwills
    Nov 13 '18 at 5:20















0















I have a Unit test function which worked. When I incorporated ILogger and Moq framework, its not catching exceptions anymore. See Last test below. In debugging the unit test step by step, I know the Exception is thrown. So not sure why its not displaying in Nunit and causing an error.



Error:



Message: Expected: <System.ArgumentException> But was: no exception thrown



using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;

namespace ElectronicsStore.Service

public class ParseVendorSupply

private readonly ILogger _logger;

public ParseVendorSupply(ILogger logger)

_logger = logger;


public VendorSupply FromCsv(string csvLine)

VendorSupply vendorsupply = new VendorSupply();

try

string values = csvLine.Split(',');
if (values.Length > 3)

throw new System.ArgumentException("Too much data");


vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);

catch (Exception)

_logger.LogInformation("An exception was thrown attempting");

return vendorsupply;





NUnit Test:



public class ParseVendorSupplyNunit
{

ILogger logger;

// This Works
[Test]
public void FromCsv_ParseCorrectly()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3";
VendorSupply vendorsupply = parseVendorSupply.FromCsv(csvLineTest);
Assert.AreEqual(5, vendorsupply.VendorId);
Assert.AreEqual(8, vendorsupply.ProductId);
Assert.AreEqual(3, vendorsupply.Quantity);


// This does not work anymore,after adding ILogger and Moq
[Test]
public void FromCsv_ParseCorrectly_Extradata()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);

string csvLineTest = "5,8,3,9,5";

Assert.That(() => parseVendorSupply.FromCsv(csvLineTest), Throws.ArgumentException);


Message: Expected: <System.ArgumentException> But was: no exception thrown









share|improve this question

















  • 1





    What does catch (Exception) do?

    – mjwills
    Nov 13 '18 at 5:20













0












0








0








I have a Unit test function which worked. When I incorporated ILogger and Moq framework, its not catching exceptions anymore. See Last test below. In debugging the unit test step by step, I know the Exception is thrown. So not sure why its not displaying in Nunit and causing an error.



Error:



Message: Expected: <System.ArgumentException> But was: no exception thrown



using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;

namespace ElectronicsStore.Service

public class ParseVendorSupply

private readonly ILogger _logger;

public ParseVendorSupply(ILogger logger)

_logger = logger;


public VendorSupply FromCsv(string csvLine)

VendorSupply vendorsupply = new VendorSupply();

try

string values = csvLine.Split(',');
if (values.Length > 3)

throw new System.ArgumentException("Too much data");


vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);

catch (Exception)

_logger.LogInformation("An exception was thrown attempting");

return vendorsupply;





NUnit Test:



public class ParseVendorSupplyNunit
{

ILogger logger;

// This Works
[Test]
public void FromCsv_ParseCorrectly()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3";
VendorSupply vendorsupply = parseVendorSupply.FromCsv(csvLineTest);
Assert.AreEqual(5, vendorsupply.VendorId);
Assert.AreEqual(8, vendorsupply.ProductId);
Assert.AreEqual(3, vendorsupply.Quantity);


// This does not work anymore,after adding ILogger and Moq
[Test]
public void FromCsv_ParseCorrectly_Extradata()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);

string csvLineTest = "5,8,3,9,5";

Assert.That(() => parseVendorSupply.FromCsv(csvLineTest), Throws.ArgumentException);


Message: Expected: <System.ArgumentException> But was: no exception thrown









share|improve this question














I have a Unit test function which worked. When I incorporated ILogger and Moq framework, its not catching exceptions anymore. See Last test below. In debugging the unit test step by step, I know the Exception is thrown. So not sure why its not displaying in Nunit and causing an error.



Error:



Message: Expected: <System.ArgumentException> But was: no exception thrown



using System;
using ElectronicsStore.Models;
using Microsoft.Extensions.Logging;

namespace ElectronicsStore.Service

public class ParseVendorSupply

private readonly ILogger _logger;

public ParseVendorSupply(ILogger logger)

_logger = logger;


public VendorSupply FromCsv(string csvLine)

VendorSupply vendorsupply = new VendorSupply();

try

string values = csvLine.Split(',');
if (values.Length > 3)

throw new System.ArgumentException("Too much data");


vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);

catch (Exception)

_logger.LogInformation("An exception was thrown attempting");

return vendorsupply;





NUnit Test:



public class ParseVendorSupplyNunit
{

ILogger logger;

// This Works
[Test]
public void FromCsv_ParseCorrectly()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);
string csvLineTest = "5,8,3";
VendorSupply vendorsupply = parseVendorSupply.FromCsv(csvLineTest);
Assert.AreEqual(5, vendorsupply.VendorId);
Assert.AreEqual(8, vendorsupply.ProductId);
Assert.AreEqual(3, vendorsupply.Quantity);


// This does not work anymore,after adding ILogger and Moq
[Test]
public void FromCsv_ParseCorrectly_Extradata()

var logger = new Mock<ILogger>();
var parseVendorSupply = new ParseVendorSupply(logger.Object);

string csvLineTest = "5,8,3,9,5";

Assert.That(() => parseVendorSupply.FromCsv(csvLineTest), Throws.ArgumentException);


Message: Expected: <System.ArgumentException> But was: no exception thrown






c# asp.net-core nunit moq






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 13 '18 at 5:18









JoeThomasJoeThomas

677




677







  • 1





    What does catch (Exception) do?

    – mjwills
    Nov 13 '18 at 5:20












  • 1





    What does catch (Exception) do?

    – mjwills
    Nov 13 '18 at 5:20







1




1





What does catch (Exception) do?

– mjwills
Nov 13 '18 at 5:20





What does catch (Exception) do?

– mjwills
Nov 13 '18 at 5:20












2 Answers
2






active

oldest

votes


















1














Your code throws the exception inside a try-catch block. Therefore your thrown exception won't leave the function scope. Resulting from that the unit test fails.



 try

string values = csvLine.Split(',');
if (values.Length > 3)

throw new System.ArgumentException("Too much data");


vendorsupply.VendorId = Convert.ToInt16(values[0]);
vendorsupply.ProductId = Convert.ToInt16(values[1]);
vendorsupply.Quantity = Convert.ToInt16(values[2]);

catch (Exception)

_logger.LogInformation("An exception was thrown attempting");



You can rethrow the ArgumentException see this stackoverflow link for further guidance. But its an bad idea to use exception for "communication" inside a method. So you could simple move the parameter check, so that it is outside the try-catch block.



Hope that helps






share|improve this answer






























    0














    (This isn't to do with Moq.) I think you're aware that you've added a try...catch block in your code which swallows the exception; but you don't understand why the assertion that a particular exception is thrown is now failing. After all you are still throwing the exception, so you're wondering why NUnit doesn't notice.



    NUnit doesn't work by observing what your code is doing while it is executing. The only way it can tell if an exception is thrown is if that exception bubbles up to the calling code (the calling code is the assertion that an exception is being thrown, in the test method).



    You can think of your assertion that an ArgumentException has been thrown as being a catch(ArgumentException). And because your new code swallows the exception, the assertion in the test won't ever see the exception, so the assertion fails.



    As a side note, relating to design, look at how your code behaves if that exception is thrown. The caller just gets back an object (just like if it had worked). So the calling code won't realise anything has gone wrong (which I'd suggest is a bad design).



    You could use Moq to verify that the LogInformation method was called once; but that might have been caused by a different exception.



    It's also worth pointing out that it's an interesting choice to call LogInformation on an something which will clearly stop the program from functioning. LogInformation is for things which may be of interest. Consider using a different method on the logger, I'd suggest LogError or worse.






    share|improve this answer






















      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53274274%2fmoq-expected-system-argumentexception-but-was-no-exception-thrown%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      Your code throws the exception inside a try-catch block. Therefore your thrown exception won't leave the function scope. Resulting from that the unit test fails.



       try

      string values = csvLine.Split(',');
      if (values.Length > 3)

      throw new System.ArgumentException("Too much data");


      vendorsupply.VendorId = Convert.ToInt16(values[0]);
      vendorsupply.ProductId = Convert.ToInt16(values[1]);
      vendorsupply.Quantity = Convert.ToInt16(values[2]);

      catch (Exception)

      _logger.LogInformation("An exception was thrown attempting");



      You can rethrow the ArgumentException see this stackoverflow link for further guidance. But its an bad idea to use exception for "communication" inside a method. So you could simple move the parameter check, so that it is outside the try-catch block.



      Hope that helps






      share|improve this answer



























        1














        Your code throws the exception inside a try-catch block. Therefore your thrown exception won't leave the function scope. Resulting from that the unit test fails.



         try

        string values = csvLine.Split(',');
        if (values.Length > 3)

        throw new System.ArgumentException("Too much data");


        vendorsupply.VendorId = Convert.ToInt16(values[0]);
        vendorsupply.ProductId = Convert.ToInt16(values[1]);
        vendorsupply.Quantity = Convert.ToInt16(values[2]);

        catch (Exception)

        _logger.LogInformation("An exception was thrown attempting");



        You can rethrow the ArgumentException see this stackoverflow link for further guidance. But its an bad idea to use exception for "communication" inside a method. So you could simple move the parameter check, so that it is outside the try-catch block.



        Hope that helps






        share|improve this answer

























          1












          1








          1







          Your code throws the exception inside a try-catch block. Therefore your thrown exception won't leave the function scope. Resulting from that the unit test fails.



           try

          string values = csvLine.Split(',');
          if (values.Length > 3)

          throw new System.ArgumentException("Too much data");


          vendorsupply.VendorId = Convert.ToInt16(values[0]);
          vendorsupply.ProductId = Convert.ToInt16(values[1]);
          vendorsupply.Quantity = Convert.ToInt16(values[2]);

          catch (Exception)

          _logger.LogInformation("An exception was thrown attempting");



          You can rethrow the ArgumentException see this stackoverflow link for further guidance. But its an bad idea to use exception for "communication" inside a method. So you could simple move the parameter check, so that it is outside the try-catch block.



          Hope that helps






          share|improve this answer













          Your code throws the exception inside a try-catch block. Therefore your thrown exception won't leave the function scope. Resulting from that the unit test fails.



           try

          string values = csvLine.Split(',');
          if (values.Length > 3)

          throw new System.ArgumentException("Too much data");


          vendorsupply.VendorId = Convert.ToInt16(values[0]);
          vendorsupply.ProductId = Convert.ToInt16(values[1]);
          vendorsupply.Quantity = Convert.ToInt16(values[2]);

          catch (Exception)

          _logger.LogInformation("An exception was thrown attempting");



          You can rethrow the ArgumentException see this stackoverflow link for further guidance. But its an bad idea to use exception for "communication" inside a method. So you could simple move the parameter check, so that it is outside the try-catch block.



          Hope that helps







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 13 '18 at 5:44









          MoerwaldMoerwald

          2,93841442




          2,93841442























              0














              (This isn't to do with Moq.) I think you're aware that you've added a try...catch block in your code which swallows the exception; but you don't understand why the assertion that a particular exception is thrown is now failing. After all you are still throwing the exception, so you're wondering why NUnit doesn't notice.



              NUnit doesn't work by observing what your code is doing while it is executing. The only way it can tell if an exception is thrown is if that exception bubbles up to the calling code (the calling code is the assertion that an exception is being thrown, in the test method).



              You can think of your assertion that an ArgumentException has been thrown as being a catch(ArgumentException). And because your new code swallows the exception, the assertion in the test won't ever see the exception, so the assertion fails.



              As a side note, relating to design, look at how your code behaves if that exception is thrown. The caller just gets back an object (just like if it had worked). So the calling code won't realise anything has gone wrong (which I'd suggest is a bad design).



              You could use Moq to verify that the LogInformation method was called once; but that might have been caused by a different exception.



              It's also worth pointing out that it's an interesting choice to call LogInformation on an something which will clearly stop the program from functioning. LogInformation is for things which may be of interest. Consider using a different method on the logger, I'd suggest LogError or worse.






              share|improve this answer



























                0














                (This isn't to do with Moq.) I think you're aware that you've added a try...catch block in your code which swallows the exception; but you don't understand why the assertion that a particular exception is thrown is now failing. After all you are still throwing the exception, so you're wondering why NUnit doesn't notice.



                NUnit doesn't work by observing what your code is doing while it is executing. The only way it can tell if an exception is thrown is if that exception bubbles up to the calling code (the calling code is the assertion that an exception is being thrown, in the test method).



                You can think of your assertion that an ArgumentException has been thrown as being a catch(ArgumentException). And because your new code swallows the exception, the assertion in the test won't ever see the exception, so the assertion fails.



                As a side note, relating to design, look at how your code behaves if that exception is thrown. The caller just gets back an object (just like if it had worked). So the calling code won't realise anything has gone wrong (which I'd suggest is a bad design).



                You could use Moq to verify that the LogInformation method was called once; but that might have been caused by a different exception.



                It's also worth pointing out that it's an interesting choice to call LogInformation on an something which will clearly stop the program from functioning. LogInformation is for things which may be of interest. Consider using a different method on the logger, I'd suggest LogError or worse.






                share|improve this answer

























                  0












                  0








                  0







                  (This isn't to do with Moq.) I think you're aware that you've added a try...catch block in your code which swallows the exception; but you don't understand why the assertion that a particular exception is thrown is now failing. After all you are still throwing the exception, so you're wondering why NUnit doesn't notice.



                  NUnit doesn't work by observing what your code is doing while it is executing. The only way it can tell if an exception is thrown is if that exception bubbles up to the calling code (the calling code is the assertion that an exception is being thrown, in the test method).



                  You can think of your assertion that an ArgumentException has been thrown as being a catch(ArgumentException). And because your new code swallows the exception, the assertion in the test won't ever see the exception, so the assertion fails.



                  As a side note, relating to design, look at how your code behaves if that exception is thrown. The caller just gets back an object (just like if it had worked). So the calling code won't realise anything has gone wrong (which I'd suggest is a bad design).



                  You could use Moq to verify that the LogInformation method was called once; but that might have been caused by a different exception.



                  It's also worth pointing out that it's an interesting choice to call LogInformation on an something which will clearly stop the program from functioning. LogInformation is for things which may be of interest. Consider using a different method on the logger, I'd suggest LogError or worse.






                  share|improve this answer













                  (This isn't to do with Moq.) I think you're aware that you've added a try...catch block in your code which swallows the exception; but you don't understand why the assertion that a particular exception is thrown is now failing. After all you are still throwing the exception, so you're wondering why NUnit doesn't notice.



                  NUnit doesn't work by observing what your code is doing while it is executing. The only way it can tell if an exception is thrown is if that exception bubbles up to the calling code (the calling code is the assertion that an exception is being thrown, in the test method).



                  You can think of your assertion that an ArgumentException has been thrown as being a catch(ArgumentException). And because your new code swallows the exception, the assertion in the test won't ever see the exception, so the assertion fails.



                  As a side note, relating to design, look at how your code behaves if that exception is thrown. The caller just gets back an object (just like if it had worked). So the calling code won't realise anything has gone wrong (which I'd suggest is a bad design).



                  You could use Moq to verify that the LogInformation method was called once; but that might have been caused by a different exception.



                  It's also worth pointing out that it's an interesting choice to call LogInformation on an something which will clearly stop the program from functioning. LogInformation is for things which may be of interest. Consider using a different method on the logger, I'd suggest LogError or worse.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 13 '18 at 6:48









                  RichardissimoRichardissimo

                  4,4152827




                  4,4152827



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53274274%2fmoq-expected-system-argumentexception-but-was-no-exception-thrown%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                      Edmonton

                      Crossroads (UK TV series)