Moq Expected: But was: no exception thrown











up vote
0
down vote

favorite












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 at 5:20















up vote
0
down vote

favorite












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 at 5:20













up vote
0
down vote

favorite









up vote
0
down vote

favorite











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 at 5:18









JoeThomas

606




606








  • 1




    What does catch (Exception) do?
    – mjwills
    Nov 13 at 5:20














  • 1




    What does catch (Exception) do?
    – mjwills
    Nov 13 at 5:20








1




1




What does catch (Exception) do?
– mjwills
Nov 13 at 5:20




What does catch (Exception) do?
– mjwills
Nov 13 at 5:20












2 Answers
2






active

oldest

votes

















up vote
1
down vote













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




























    up vote
    0
    down vote













    (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',
      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








      up vote
      1
      down vote













      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

























        up vote
        1
        down vote













        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























          up vote
          1
          down vote










          up vote
          1
          down vote









          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 at 5:44









          Moerwald

          2,78741438




          2,78741438
























              up vote
              0
              down vote













              (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

























                up vote
                0
                down vote













                (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























                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  (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 at 6:48









                  Richardissimo

                  3,9822726




                  3,9822726






























                       

                      draft saved


                      draft discarded



















































                       


                      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

                      Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                      ComboBox Display Member on multiple fields

                      Is it possible to collect Nectar points via Trainline?