Moq Expected: But was: no exception thrown
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
add a comment |
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
1
What doescatch (Exception)
do?
– mjwills
Nov 13 '18 at 5:20
add a comment |
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
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
c# asp.net-core nunit moq
asked Nov 13 '18 at 5:18
JoeThomasJoeThomas
677
677
1
What doescatch (Exception)
do?
– mjwills
Nov 13 '18 at 5:20
add a comment |
1
What doescatch (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
add a comment |
2 Answers
2
active
oldest
votes
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
add a comment |
(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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
add a comment |
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
add a comment |
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
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
answered Nov 13 '18 at 5:44
MoerwaldMoerwald
2,93841442
2,93841442
add a comment |
add a comment |
(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.
add a comment |
(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.
add a comment |
(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.
(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.
answered Nov 13 '18 at 6:48
RichardissimoRichardissimo
4,4152827
4,4152827
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
What does
catch (Exception)
do?– mjwills
Nov 13 '18 at 5:20