Why is my mocked logger shown as invoked and yet also not?












1















My first foray into mocking in a WPF application. The code I'm testing is part of an MVVM ViewModel Method and looks like this:



try
{
var airframesForRegistration = this.UnitOfWork.Airframes.GetAirframesForRegistration(this.SearchRegistration);
this.currentAirframes = new ObservableCollection<Airframe>(airframesForRegistration);
}
catch (Exception ex)
{
this.logger.Error($"Could not access the database", ex);
throw;
}


I want to test that




  1. the error is written to the logger service and

  2. that the exception is thrown.


To do this I'm using XUnit and Moq thus:



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail()
{
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";
DataException exception = new DataException();

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

Assert.Throws<DataException>(() => afrvm.GetAirframesForSearchRegistration());

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));

}


The test fails thus:



Message: Moq.MockException : 
Expected invocation on the mock exactly 1 times, but was 0 times: x => x.Error("Could not access the database'", System.Data.DataException: Data Exception.)

Configured setups:
ILog x => x.Error("Could not access the database", System.Data.DataException: Data Exception.)

Performed invocations:
ILog.Warn("No Operators found in the database")
ILog.Warn("No airframe statuses found in the database")
ILog.Error("Could not access the database", System.Data.DataException: Data Exception.
at Moq.MethodCall.Execute(Invocation invocation) in C:projectsmoq4srcMoqMethodCall.cs:line 120


(NB The extra ILog warnings occur elsewhere in the ViewModel and I was expecting those).



Question



This implies that the error logging was invoked and yet the test fails because it was invoked zero times! How can Moq and XUnit be set up to correctly test for this scenario?










share|improve this question

























  • The setup of the logger arguments is the problem. differing instances mean they wont match

    – Nkosi
    Nov 27 '18 at 21:56











  • @Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

    – ifinlay
    Nov 27 '18 at 22:00











  • the mock unit of work is throwing a new exception. Not the one you are expecting.

    – Nkosi
    Nov 27 '18 at 22:01
















1















My first foray into mocking in a WPF application. The code I'm testing is part of an MVVM ViewModel Method and looks like this:



try
{
var airframesForRegistration = this.UnitOfWork.Airframes.GetAirframesForRegistration(this.SearchRegistration);
this.currentAirframes = new ObservableCollection<Airframe>(airframesForRegistration);
}
catch (Exception ex)
{
this.logger.Error($"Could not access the database", ex);
throw;
}


I want to test that




  1. the error is written to the logger service and

  2. that the exception is thrown.


To do this I'm using XUnit and Moq thus:



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail()
{
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";
DataException exception = new DataException();

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

Assert.Throws<DataException>(() => afrvm.GetAirframesForSearchRegistration());

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));

}


The test fails thus:



Message: Moq.MockException : 
Expected invocation on the mock exactly 1 times, but was 0 times: x => x.Error("Could not access the database'", System.Data.DataException: Data Exception.)

Configured setups:
ILog x => x.Error("Could not access the database", System.Data.DataException: Data Exception.)

Performed invocations:
ILog.Warn("No Operators found in the database")
ILog.Warn("No airframe statuses found in the database")
ILog.Error("Could not access the database", System.Data.DataException: Data Exception.
at Moq.MethodCall.Execute(Invocation invocation) in C:projectsmoq4srcMoqMethodCall.cs:line 120


(NB The extra ILog warnings occur elsewhere in the ViewModel and I was expecting those).



Question



This implies that the error logging was invoked and yet the test fails because it was invoked zero times! How can Moq and XUnit be set up to correctly test for this scenario?










share|improve this question

























  • The setup of the logger arguments is the problem. differing instances mean they wont match

    – Nkosi
    Nov 27 '18 at 21:56











  • @Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

    – ifinlay
    Nov 27 '18 at 22:00











  • the mock unit of work is throwing a new exception. Not the one you are expecting.

    – Nkosi
    Nov 27 '18 at 22:01














1












1








1


0






My first foray into mocking in a WPF application. The code I'm testing is part of an MVVM ViewModel Method and looks like this:



try
{
var airframesForRegistration = this.UnitOfWork.Airframes.GetAirframesForRegistration(this.SearchRegistration);
this.currentAirframes = new ObservableCollection<Airframe>(airframesForRegistration);
}
catch (Exception ex)
{
this.logger.Error($"Could not access the database", ex);
throw;
}


I want to test that




  1. the error is written to the logger service and

  2. that the exception is thrown.


To do this I'm using XUnit and Moq thus:



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail()
{
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";
DataException exception = new DataException();

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

Assert.Throws<DataException>(() => afrvm.GetAirframesForSearchRegistration());

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));

}


The test fails thus:



Message: Moq.MockException : 
Expected invocation on the mock exactly 1 times, but was 0 times: x => x.Error("Could not access the database'", System.Data.DataException: Data Exception.)

Configured setups:
ILog x => x.Error("Could not access the database", System.Data.DataException: Data Exception.)

Performed invocations:
ILog.Warn("No Operators found in the database")
ILog.Warn("No airframe statuses found in the database")
ILog.Error("Could not access the database", System.Data.DataException: Data Exception.
at Moq.MethodCall.Execute(Invocation invocation) in C:projectsmoq4srcMoqMethodCall.cs:line 120


(NB The extra ILog warnings occur elsewhere in the ViewModel and I was expecting those).



Question



This implies that the error logging was invoked and yet the test fails because it was invoked zero times! How can Moq and XUnit be set up to correctly test for this scenario?










share|improve this question
















My first foray into mocking in a WPF application. The code I'm testing is part of an MVVM ViewModel Method and looks like this:



try
{
var airframesForRegistration = this.UnitOfWork.Airframes.GetAirframesForRegistration(this.SearchRegistration);
this.currentAirframes = new ObservableCollection<Airframe>(airframesForRegistration);
}
catch (Exception ex)
{
this.logger.Error($"Could not access the database", ex);
throw;
}


I want to test that




  1. the error is written to the logger service and

  2. that the exception is thrown.


To do this I'm using XUnit and Moq thus:



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail()
{
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";
DataException exception = new DataException();

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

Assert.Throws<DataException>(() => afrvm.GetAirframesForSearchRegistration());

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));

}


The test fails thus:



Message: Moq.MockException : 
Expected invocation on the mock exactly 1 times, but was 0 times: x => x.Error("Could not access the database'", System.Data.DataException: Data Exception.)

Configured setups:
ILog x => x.Error("Could not access the database", System.Data.DataException: Data Exception.)

Performed invocations:
ILog.Warn("No Operators found in the database")
ILog.Warn("No airframe statuses found in the database")
ILog.Error("Could not access the database", System.Data.DataException: Data Exception.
at Moq.MethodCall.Execute(Invocation invocation) in C:projectsmoq4srcMoqMethodCall.cs:line 120


(NB The extra ILog warnings occur elsewhere in the ViewModel and I was expecting those).



Question



This implies that the error logging was invoked and yet the test fails because it was invoked zero times! How can Moq and XUnit be set up to correctly test for this scenario?







wpf exception logging moq xunit






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 27 '18 at 21:54









Nkosi

118k17135200




118k17135200










asked Nov 27 '18 at 21:49









ifinlayifinlay

354417




354417













  • The setup of the logger arguments is the problem. differing instances mean they wont match

    – Nkosi
    Nov 27 '18 at 21:56











  • @Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

    – ifinlay
    Nov 27 '18 at 22:00











  • the mock unit of work is throwing a new exception. Not the one you are expecting.

    – Nkosi
    Nov 27 '18 at 22:01



















  • The setup of the logger arguments is the problem. differing instances mean they wont match

    – Nkosi
    Nov 27 '18 at 21:56











  • @Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

    – ifinlay
    Nov 27 '18 at 22:00











  • the mock unit of work is throwing a new exception. Not the one you are expecting.

    – Nkosi
    Nov 27 '18 at 22:01

















The setup of the logger arguments is the problem. differing instances mean they wont match

– Nkosi
Nov 27 '18 at 21:56





The setup of the logger arguments is the problem. differing instances mean they wont match

– Nkosi
Nov 27 '18 at 21:56













@Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

– ifinlay
Nov 27 '18 at 22:00





@Nkosi Haven't I ensured that I'm using the same instances by using the variables 'message' and 'exception' in both the .Setup and .Verify?

– ifinlay
Nov 27 '18 at 22:00













the mock unit of work is throwing a new exception. Not the one you are expecting.

– Nkosi
Nov 27 '18 at 22:01





the mock unit of work is throwing a new exception. Not the one you are expecting.

– Nkosi
Nov 27 '18 at 22:01












1 Answer
1






active

oldest

votes


















3














The setup of the logger arguments is the problem.



Differing instances between what is thrown and what is expected mean they wont match when the mock is invoked.



The mock unit of work is throwing a new exception. Not the one you are expecting.



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
DataException exception = new DataException();

mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(exception);

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));
}
}


For a looser expectation you could have use It.IsAny<> argument matchers



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, It.IsAny<DataException>()));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, It.IsAny<DataException>()), Times.Exactly(1));
}
}





share|improve this answer


























  • Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

    – ifinlay
    Nov 27 '18 at 22:09











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%2f53508715%2fwhy-is-my-mocked-logger-shown-as-invoked-and-yet-also-not%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









3














The setup of the logger arguments is the problem.



Differing instances between what is thrown and what is expected mean they wont match when the mock is invoked.



The mock unit of work is throwing a new exception. Not the one you are expecting.



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
DataException exception = new DataException();

mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(exception);

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));
}
}


For a looser expectation you could have use It.IsAny<> argument matchers



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, It.IsAny<DataException>()));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, It.IsAny<DataException>()), Times.Exactly(1));
}
}





share|improve this answer


























  • Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

    – ifinlay
    Nov 27 '18 at 22:09
















3














The setup of the logger arguments is the problem.



Differing instances between what is thrown and what is expected mean they wont match when the mock is invoked.



The mock unit of work is throwing a new exception. Not the one you are expecting.



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
DataException exception = new DataException();

mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(exception);

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));
}
}


For a looser expectation you could have use It.IsAny<> argument matchers



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, It.IsAny<DataException>()));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, It.IsAny<DataException>()), Times.Exactly(1));
}
}





share|improve this answer


























  • Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

    – ifinlay
    Nov 27 '18 at 22:09














3












3








3







The setup of the logger arguments is the problem.



Differing instances between what is thrown and what is expected mean they wont match when the mock is invoked.



The mock unit of work is throwing a new exception. Not the one you are expecting.



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
DataException exception = new DataException();

mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(exception);

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));
}
}


For a looser expectation you could have use It.IsAny<> argument matchers



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, It.IsAny<DataException>()));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, It.IsAny<DataException>()), Times.Exactly(1));
}
}





share|improve this answer















The setup of the logger arguments is the problem.



Differing instances between what is thrown and what is expected mean they wont match when the mock is invoked.



The mock unit of work is throwing a new exception. Not the one you are expecting.



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
DataException exception = new DataException();

mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(exception);

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, exception));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, exception), Times.Exactly(1));
}
}


For a looser expectation you could have use It.IsAny<> argument matchers



[Fact]
public void GetAirframesForSearchRegistration_DBAccessFail() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IUnitOfWork>()
.Setup(x => x.Airframes.GetAirframesForRegistration("AAAA"))
.Throws(new DataException());

string message = "Could not access the database";

mock.Mock<ILog>()
.Setup(x => x.Error(message, It.IsAny<DataException>()));

var afrvm = mock.Create<AirframesForRegistrationViewModel>();

afrvm.SearchRegistration = "AAAA";

//Act
Action act = () => afrvm.GetAirframesForSearchRegistration();

//Assert
Assert.Throws<DataException>(act);

mock.Mock<ILog>()
.Verify(x => x.Error(message, It.IsAny<DataException>()), Times.Exactly(1));
}
}






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 27 '18 at 22:09

























answered Nov 27 '18 at 22:01









NkosiNkosi

118k17135200




118k17135200













  • Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

    – ifinlay
    Nov 27 '18 at 22:09



















  • Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

    – ifinlay
    Nov 27 '18 at 22:09

















Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

– ifinlay
Nov 27 '18 at 22:09





Brilliant! Works fine now so thanks for that. Strange error reporting by Moq though. The inference was that the logging was in error when in fact it was the exception.

– ifinlay
Nov 27 '18 at 22:09




















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%2f53508715%2fwhy-is-my-mocked-logger-shown-as-invoked-and-yet-also-not%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

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

Calculate evaluation metrics using cross_val_predict sklearn

Insert data from modal to MySQL (multiple modal on website)