Getting started with Mocking using Moq in .NET (Core, Framework, Standard)

Поделиться
HTML-код
  • Опубликовано: 24 дек 2024

Комментарии • 161

  • @nickchapsas
    @nickchapsas  3 года назад +3

    Are you looking for more training? Check out my "From Zero to Hero: Unit testing in C#" course: nickchapsas.com/p/from-zero-to-hero-unit-testing-in-c

    • @haskell3702
      @haskell3702 Год назад

      Hi, how can I verify a protected method call using DI?
      when I use var mock=new Mock
      and try setup the protected with mock.Protected().Setup("MyMethod") I get a error: "No protected method found", but the method exists and it is virtual
      but if I use var mock=new Mock it works but this way is not acceptable for my project, you know

  • @da3dsoul
    @da3dsoul 2 месяца назад +3

    4 years late in learning this lol. Man, you have gotten so much better at presenting in these 4 years. Great job

  • @rvranny
    @rvranny 4 года назад +94

    My day today:
    1. Tried to understand Mocking over the Internet: > 6 hours 😟
    2. Took a nap: 30mins 😴
    3. Finally learnt through this video: 20mins 🙂
    4. Subscribed:1sec 🤘
    Thank you Nick, please go for advance xUnit and Moq.

  • @ppriyadarshini81
    @ppriyadarshini81 7 месяцев назад +1

    I was literally tired watching videos on Nunit but this is "THE" best explanation !! hats off to you efforts.. !!

  • @vmamore
    @vmamore 4 года назад +28

    An advanced video would be awesome, Thanks Nick!

  • @thesuperiorman8342
    @thesuperiorman8342 3 года назад

    I watched this first before knowing anything about mocking but I didn't understand much. I then read a beginner friendly article that gave a very simple introduction and then later came back to watch this video and it all makes sense now. Your examples are helpful because they are real world which is what I need for my project.

    • @nickchapsas
      @nickchapsas  3 года назад +1

      Yeah I got that feedback quite a bit. So the assumption of the video is that the viewer already understands the concept of mocking, in order to keep the video length smaller, but it might be harder for complete beginners.

  • @AhmedRaza-ru1rj
    @AhmedRaza-ru1rj 2 года назад

    I spent hours figuring out why I was getting NullReferenceException as I just started learning and using moq. Your video covered the exact scenario. Thanks, mate

  • @justraccoon3047
    @justraccoon3047 2 года назад

    Omg, bro. I had tried to understand it with lots of mistakes for 4 hours, but you just explained it in 20 minutes in a simple way. Thanks a lot!)

  • @react_33
    @react_33 3 года назад

    I was like nah imma head out from testing part and then I found this video. 30 mins and all good. thnx mate.

  • @GrahamStw
    @GrahamStw 4 года назад +6

    Nice video. thanks.
    Small point: some viewers might be tempted to put the creation of the Mock instances at the class fixture level (e.g. in an IClassFixture for xUnit). Don’t do that because the Mock contains state information (which Setups exist, what has been called, what was Verified), so a new Mock instance should be created for each test case.

  • @digimonsta
    @digimonsta 4 года назад +3

    Loving these videos. Short enough and in sufficient detail to grasp the basics quickly, without having to devote hours at a time.

  • @vishalbalani7692
    @vishalbalani7692 3 года назад +1

    Thank you Nick, I always had hard time with mocking test cases but finally I was able to successfully mock and fix the test cases which were having problem. Thanks a lot!!

  • @arwwarr7578
    @arwwarr7578 2 года назад

    You're just the best, you can explain anything in a perfectly understandable way.

  • @rishikeshkumar8141
    @rishikeshkumar8141 3 года назад +1

    Very well explained with real examples. Awesome!

  • @sherazdotnet
    @sherazdotnet 3 года назад

    1+ to naming convention on class name. Very handy. I haven't used Rider (in fact didn't even know about it) but I use Resharper in VS and one very handy feature is to see the list of all the files by pressing Ctrl + N. Now when you name a test file as a convention of Object + Test, it becomes very easy to find the tests. If I have a TradeBookingViewModel class, I can have a TradeBookingViewModelTests and just like that, when I type TBVM in Ctrl+N window, it will pop both classes showing actual class and the tests for that class.

  • @zv7ws
    @zv7ws 2 года назад

    Thanks for the video Nick, it was just what i was looking for :)

  • @sunilanthony17
    @sunilanthony17 4 года назад

    Thank you, Nick. I tried both and love Moq better. I'm sticking with it.

  • @yaknad
    @yaknad 4 года назад +1

    Great video, as always. Straight to the point, very clear and thorough. Thanks Nick!

  • @harikakiran18
    @harikakiran18 4 года назад +6

    Great material, thanks Nick for putting this together. Appreciate it! Looking forward to see advanced videos especially eliminating the external dependencies like database, network, api calls etc. with some mocked data. You have got great content on your channel, sub'ed. Will spend some time, thank you.

  • @argelpamintuango1956
    @argelpamintuango1956 4 года назад

    this video saves me
    !
    very easy to understand on the Moq usage
    thanks Nick!

  • @michaelkopljan578
    @michaelkopljan578 4 года назад

    Thanks Nick for all your videos!

  • @vitaliykoritko5080
    @vitaliykoritko5080 3 года назад

    Good video, but better to use conrete value or Is instead of IsAny

  • @hansikachowdary4581
    @hansikachowdary4581 4 года назад

    Great video nick! Helped a lot.

  • @sherifmankarious88
    @sherifmankarious88 4 года назад

    Thanks for sharing, yes an advanced is indeed needed.

  • @jakubczechowski1159
    @jakubczechowski1159 3 года назад

    Thank you for the video!

  • @dave_1996
    @dave_1996 Год назад

    Great video, very helpful!

  • @sagarpatil5997
    @sagarpatil5997 3 года назад

    Very nice explanation Nick.. Keep it up...!!

  • @iryzen9673
    @iryzen9673 2 года назад

    Thank you so much! You helped me a lot!

  • @luisbragado171
    @luisbragado171 2 года назад

    Excellent example and you have a great pronunciation for a mexican, thank you very much ... subscribed!

  • @anamariacompany1920
    @anamariacompany1920 3 года назад

    Great demo!!!

  • @fatemehfathollahi1921
    @fatemehfathollahi1921 2 года назад

    Thank you for this useful video

  • @RavindraKumar-dh6dn
    @RavindraKumar-dh6dn 4 года назад

    Awesome !! Great video to understand, how to write test case
    Well explained

  • @nishthaarora1907
    @nishthaarora1907 3 года назад

    very good explanation..thanks!!

  • @alisadeghi3642
    @alisadeghi3642 2 года назад

    excellent tutorial

  • @QuickZ_
    @QuickZ_ 2 года назад

    Very nice job again, sensei!
    But I hope people dont start returning null as a result. Null should mean "I dont know" if anything. You already know this Nick since you made videos about better ways. Just putting it out for the people. To many use null as a valid value.

  • @TroyMakesGames
    @TroyMakesGames 4 года назад

    Fantastic video! Thanks

  • @rossthemusicandguitarteacher
    @rossthemusicandguitarteacher 4 года назад

    Very good explanation
    :)

  • @emilgebl8644
    @emilgebl8644 2 года назад +1

    Regarding the log information, what if you use dependency injection and sent the logger in as Ilogger Logger? do you mock it then? how could you compare it then like at 19:12

  • @shuvo9131
    @shuvo9131 2 года назад

    thanks for the video, I love it.

  • @salarkazazi7584
    @salarkazazi7584 3 года назад

    Thank you so much, very informative and well explained :-)

  • @hvndev476
    @hvndev476 3 года назад

    Nice. Thank for sharing

  • @piotrc966
    @piotrc966 4 года назад +9

    Yes, we want advanced :).

  • @zohashobbar118
    @zohashobbar118 2 года назад

    that was grate, thanks

  • @serhiihorun6298
    @serhiihorun6298 4 года назад

    Great work!

  • @GBG731
    @GBG731 4 года назад

    hallo Nick, Thanks for the tutorial,

  • @nadaralpenidze9549
    @nadaralpenidze9549 4 года назад +4

    Hey Nick, amazing video.
    I have one question,
    If my purpose is testing GetUserById and I create a mock which returns a value I'm deliberately giving to it, how does it benefit my test?
    I won't know if my actual service works, I know that the mock works.
    Am I missing something?

    • @JustMe-hv5re
      @JustMe-hv5re 4 года назад +3

      I would say no, I have asked this question repeatedly to people who promote it and the only benefit is testing exceptions/testing for nulls. This will not test data type matching for parameters, missing parameters being passed to stored procedures, columns coming back lining up (ie assigning them to the actual class property coming back and referencing it), or that stored procedure names are correct. As far as I am concerned this a waste of time and repos really need integration testing to a test db.

    • @Psykorr
      @Psykorr 3 года назад +2

      Agreed. Use mocks for the things around the db calls, and actually test bd calls with some tool like postman or some sql program like sql server management studio or whatever on test bd's. I've seen real problems with calling systems that only use mocks for testing db calls. Often they don't work and real people are affected by it.

    • @robertsnyder4480
      @robertsnyder4480 2 года назад +1

      Along the same words as the first 2 replies I'd treat db calls like any other external system. Make the mock return reasonable data that you would legit see (or portions of it). knowing what your external service is going to return is part of the leg work of Proof of concept projects or having a integration test project that only runs locally to test these data structures. Just know that those tests are usually brittle and break easily and are hard to understand usually.

  • @andriyzubyk629
    @andriyzubyk629 4 года назад

    Thanks Nick

  • @JohnSourvinos
    @JohnSourvinos 3 года назад

    Greetings from 39°38'N / 19°55'E. In the GET method (around 11:30 - line 28) you provide the expected response as a CustomerDto object. Later in the Assert (line 41), the customerId is compared with the CustomerDto's Id. Since the call to the service is fake and no 'real' data is fetched, what is the point of comparing two things that are by definition equal? Unless this test is done only to increase the code coverage, can you please give us a good reason for testing the GET method?

  • @torrvic1156
    @torrvic1156 2 месяца назад

    Who is Theodor Ntakouris anyway? You should tell us more Nick? 😊Otherwise thanks for awesome video! It really helped me to realise how can I use this unit/integration tests in real applications.

  • @joelvilabringuez7162
    @joelvilabringuez7162 2 года назад

    Excellent

  • @ursmuller5545
    @ursmuller5545 2 года назад

    Thanks 👍

  • @mikolajsemeniuk8574
    @mikolajsemeniuk8574 3 года назад

    great video

  • @hchattaway
    @hchattaway Год назад

    This is a great video and answered a lot of questions.. but i still have one which may be a stupid question! :)....
    If a method is being setup as shown and you specify what it shall return, the underlying implementation is still not actually being called right? it seems like you're telling it what to return so the test will always pass.... that is unless of course the actual implementation is being called somehow.. but I don't see that...
    Could you clarify this confusion? Thanks!

  •  4 года назад +1

    Congratulations for you video, I was looking for this project in your git hub repository but I didn't found it . I would like to check it .

  • @bigboy3775
    @bigboy3775 2 года назад

    Thx for this toturial! I have a question, how do I see the code coverage? I don't have the right-click option to "View Code Coverage"

  • @brahmcdude685
    @brahmcdude685 3 года назад

    14:41 ".Returns(() => null);" - I built this example using non-async. I still got an error for this: ".Returns(null);". Here is the error: "CS0121 The call is ambiguous between... 'IReturns.Returns(TResult)' and 'IReturns.Returns(Func)'". Using ".Returns((CustomerDto)null);" also resolves this error.

  • @vabhs192003
    @vabhs192003 4 года назад +1

    Nick: Any specific reason to pick the Xunit over NUnit? Loving your videos. Please keep posting new stuff. Your playlist is a treasure trove of complex concepts made simple. Already a subscriber. :)

    • @robertsnyder4480
      @robertsnyder4480 2 года назад +1

      I just had a talk at work on this very subject. Even though I used to contribute to NUnit, I'm here to tell you that it really doesn't matter between xUnit, NUnit, or MsTest v2. There is very little that you can't do in one over the other. If you refer to Nick's video on Nuget packages you should use he also mentions getting FluentAssertions which makes the argument of you prefer the way assertions are written in one framework over another. We went with xUnit at my current client because it keeps with the mentality of writing helper classes in your test projects that you can pass into the ctor just like you would with production code.

  • @redachouiba4862
    @redachouiba4862 4 года назад

    Good job, we are waiting the next video about NSubstitute & fake ...

  • @haskell3702
    @haskell3702 Год назад

    Hi, how can I verify a protected method call using DI?
    when I use var mock=new Mock
    and try setup the protected with mock.Protected().Setup("MyMethod") I get a error: "No protected method found", but the method exists and it is virtual
    but if I use var mock=new Mock it works but this way is not acceptable for my project, you know

  • @grigorecosmin
    @grigorecosmin 3 года назад +1

    "Returns()" from the repo mock is returning a Task that can't be converted to the model. help

    • @AyushKarn25
      @AyushKarn25 3 года назад +1

      same issue, please let me know if you solve it

    • @grigorecosmin
      @grigorecosmin 3 года назад

      @@AyushKarn25 Yes, use ReturnsAsync().

    • @AyushKarn25
      @AyushKarn25 3 года назад

      @@grigorecosmin it says this requires a receiver of type ISetupSequentialResult
      Any solution to this?

    • @AyushKarn25
      @AyushKarn25 3 года назад

      @@grigorecosmin when using ReturnAsync it says only assignment, call, increment, decrement, await and new object expressions can be used as a statement

  • @MikeBSc
    @MikeBSc 2 года назад

    You haven't shown how to include the Moq libraries. I put "using Moq;" at the top of my test class and says it can not be found.

  • @steveo600rr
    @steveo600rr 4 года назад +4

    I don't see the github repo?

  • @atifsaeedkhan9207
    @atifsaeedkhan9207 Год назад

    Hey man, would you please send me link in which you discussed the Microsoft logger for dot net core web api. thanks in advance

  • @ravibugude1934
    @ravibugude1934 2 года назад

    it was a great session. How can we mock a external library extension extension methods using mock and XUnit

  • @koryphaee4796
    @koryphaee4796 4 года назад +2

    I think NSubstitute is the much better mocking framework. The code is so much more readable and easier to understand.

    • @nickchapsas
      @nickchapsas  4 года назад +5

      I totally agree with you as well. I am personally using NSubstitude and the next video is about that. I needed to show how NSub improves upon Moq so I had to show Moq first before I show NSub.

    • @koryphaee4796
      @koryphaee4796 4 года назад +1

      @@nickchapsas Alright that makes sense. Looking forward to that next video. Btw your Blazor video series helped me a lot.

  • @alevsoft
    @alevsoft 4 года назад

    Like and a Subscription. Great rapid walkthorough. Thank you!

  • @priyanshu4016
    @priyanshu4016 3 года назад

    did covered unit test will also work for visual studio?

  • @Bikramkumarsahoo1988
    @Bikramkumarsahoo1988 4 года назад

    What kind of extensions are you using while writing code in vs code tool.

  • @Tajemniczy
    @Tajemniczy 2 года назад

    Hey, big thanks for the video:) now all is more understandable, I just starting playing with unit tests.. I have one question, can you tell me how you have aaa autocomplete it (Arrange Act Assert) ?:) thanks
    PS. For right now I make it snippet file and manually I'm adding this into visual studio and it's working fine but maybe is some already nuget with this function:)?

    • @nickchapsas
      @nickchapsas  2 года назад

      I have my own code template that implements that for me in rider

    • @Tajemniczy
      @Tajemniczy 2 года назад

      @@nickchapsas aa ok:), the same day I tried to find an extension to visual studio that would have such functionality, but unfortunately I did not find anything, so I decided to see if it is hard to create such an extension with such functionality and I sat up all night and managed to create such a thing, it now generates me AAA (Arrange, Act, Assert) and test methods that contain it, if you want it you can find in the marketplace under the name AAASnippet including documentation ;d. It's not some mega awesome, it's my first, but it does what it's supposed to do :) "AAASnippet"

  • @SantyaRocks
    @SantyaRocks 3 года назад

    Hi Nick
    Hope you're doing well. I watched your all xunit video
    I'm struggling for writing unit test using xunit framework. One for the method is inserting records into SQL db. I have written unit test case for this method but in the end cmd. executenonquery throwing exception like below
    "BeginExecuteNonQuery requires an open and available connection. The connection currently state is closed"
    I believe I need to mock sqlconnection. Any suggestions. Appreciated

  • @khaledslaimia3135
    @khaledslaimia3135 3 года назад

    good video dear sir.but i have a problem,i work with automapper and the controller return null.it seems that the autommaper should be inciated only one time.can yo help me with that

  • @viniciussantosaguiar9543
    @viniciussantosaguiar9543 4 года назад

    Super good! It helps me a lot!!!

  • @mikolajsemeniuk8574
    @mikolajsemeniuk8574 3 года назад

    where is the link to repo and how can we mock DataContext?

  • @marekk9008
    @marekk9008 4 года назад +1

    I would also like to watch a video about an advanced usage

  • @alpsavasdev
    @alpsavasdev Год назад

    I really don’t understand copy-pasting the exception message inbetween the test and the method implementation. This is one of the things about unit testing which does not sound quite right to me. I don’t know if there is a better way, though.

  • @rs3800
    @rs3800 2 года назад

    have you guys ever encountered problems with visibility to MOQ? does not work for me to .Setup(), whereas it works fine with for the rest of the Test but not for setting up MOQ.

    • @robertsnyder4480
      @robertsnyder4480 2 года назад

      not personally. The only time I've done this is when I've mocked HttpClient (well the handler that gets passed into the ctor). It only has a protected member that you have to override. There is a contribs nuget package to help with this but you can also define an interface and use the .Internal().As() or .Protected().As(). I find this easier to deal with as long as I know the hidden signature won't change.

  • @zerosandones7547
    @zerosandones7547 2 года назад

    is the _sut naming convention a standard when doing a test?

    • @robertsnyder4480
      @robertsnyder4480 2 года назад

      I don't think it's standard however I've seen it a fair number of times and do it myself.

    • @zerosandones7547
      @zerosandones7547 2 года назад

      @@robertsnyder4480 I think I'll get used to _sut instead of _concreteClass right 😆

  • @TheRabinarayan
    @TheRabinarayan 4 года назад +2

    unable to download the source code.pls help

  • @sherazdotnet
    @sherazdotnet 3 года назад

    Quick Question: Why are you using constructor in test class? Not sure which testing framework you are using but I think it should have a Setup attribute or something similar that you can decorate your method which will make the framework run the method every time a new test is run. Wondering why you decided to use constructor instead?
    Update: figured it out. you are using XUnit and here is what they say
    [SetUp] [TestInitialize] Constructor We believe that use of [SetUp] is generally bad. However, you can implement a parameterless constructor as a direct replacement. See Note 2
    Cool.

    • @nickchapsas
      @nickchapsas  3 года назад +2

      Nah that’s not needed in xunit it’s unnecessary. The pattern with xunit is constructor for setup and dispose method for tear down which is way cleaner

    • @sherazdotnet
      @sherazdotnet 3 года назад

      @@nickchapsas yep agreed. I updated my comment as well showing what xUnit says.

  • @zerosandones7547
    @zerosandones7547 2 года назад

    I got confused on the Repository and the Service. Why does both of them have the same exact methods? Like, the repository has GetAllAsync(), and the service has GetAllAsync() as well, but the service uses the repository's method. Shouldn't we just use the repository in the controller? I'm new to things like this, and I just use an IMyRepository in my controllers.

    • @robertsnyder4480
      @robertsnyder4480 2 года назад

      it's not uncommen for the service to have multiple repositories or other external business rules and logic. His example helped to simplify things. So as far as business is concerned you're just getting customer data but that might include addresses and images and html.. You could be testing flow or how it reacts to systems being down. Hope this helps

    • @zerosandones7547
      @zerosandones7547 2 года назад

      @@robertsnyder4480 why don't we add the service and the repository as a dependency to the controller?

    • @robertsnyder4480
      @robertsnyder4480 2 года назад

      @@zerosandones7547 it might just be naming if you are referring to the controller in MVC pattern then you are right. If you mean controller as in entry point for web API then no. This is entry point and should deal with validation of the request and returning appropriate response based on your service output.

  • @andersonpaolo2202
    @andersonpaolo2202 4 года назад +2

    Hi Nick, thank you for your video's. Can you put your code her please, i can't find it in your link

  • @shaunhunterit342
    @shaunhunterit342 Год назад

    Your Github repo for this app has over 2000 commits. Which commit should we download for this video?

  • @nelsonfabianriosdeantonio6211
    @nelsonfabianriosdeantonio6211 4 года назад

    Awesome

  • @somnathkadam1233
    @somnathkadam1233 2 года назад +2

    can please share source code link?

  • @jfpinero
    @jfpinero 3 года назад

    I didn't watch the whole video but when creating your mocks, you should specify MockBehavior.Strict or whatever it is to make sure you are not calling something you didn't intend.

  • @RenatoFontes
    @RenatoFontes 3 года назад +4

    Aren't you just testing the mock and not the actual code?

  • @markopavlovic6066
    @markopavlovic6066 3 года назад

    Helloo my brother when I want to display triple aaa like you there is no snippet for that, can you tell me how to do it?

    • @nickchapsas
      @nickchapsas  3 года назад

      I created a Live Templates using my Rider's feature. It's different based on the IDE that you are using. In Visual Studio it's called Snippets.

  • @EricOnYouTube
    @EricOnYouTube 4 года назад

    How did you get the aaa to expand to Arrange Act Assert?

    • @nickchapsas
      @nickchapsas  4 года назад

      I have created a template for it in JetBrains Rider so I just to aaa and press Tab and it creates it for me

  • @uakrongrad
    @uakrongrad 2 года назад

    great video, sorry I'm having trouble locating the source code for the project demo'd. I do not see a direct reference, nor indirectly from the git hub link. please add it. TYVM

    • @nickchapsas
      @nickchapsas  2 года назад

      The first line in the description will point you to the code

  • @seacprogrammer8455
    @seacprogrammer8455 4 года назад +1

    WHERE IS THIS SOLUTION ON YOUR SOURCES REPO WHATS IT NAMED ?!

  • @yaaanakutty8212
    @yaaanakutty8212 3 года назад

    Hai can you please tell me how to return only response and how to return null and nonull in xunit

  • @whateverman3846
    @whateverman3846 4 года назад

    Nice tutorial but the link in desc didnt take me to source code, is there a direct link ?

  • @CG-xl4tu
    @CG-xl4tu Год назад

    I see some example use [Test] instead of [Fact] with Moq, can anyone explain?

    • @gavinsmith9033
      @gavinsmith9033 10 месяцев назад

      I don't know why this question doesn't have a response (or why I'm here! Thought process was, "are people still using Moq?"). Anyway for anyone else that stumbles across it. Those attributes are not part of Moq they are the testing framework, [Fact] is xUnit, [Test] possibly nUnit, [TestMethod] for example is MSTest. Hope that helps somebody.

  • @HidayetArgandabi
    @HidayetArgandabi 3 года назад

    could you please share the project link

  • @pavfrang
    @pavfrang 2 года назад

    Unfortunately the behavior with ILogger and extension methods (LogDebug, LogInformation) is not supported. You have to write the plain Log method which is quite big and almost impractical.
    I suspect that's why you wrote a "generic ILoggingService" and not the standard ILogger.

  • @kostasntou8649
    @kostasntou8649 4 года назад

    Ωραίος !

  • @enissay9950
    @enissay9950 2 года назад

    Hi Nick, amazing video as usual.
    I tried to add the shortcut aaa to generate my fact method, but I failed miserably. I have successfully added it to the LiveTemplates, but teh shortcut is not working in the Unitest context, not sure how to configure that :-/
    Which brings me to a request: can you have a video to show your favorite custom templates, and maybe other Rider tricks as well as how to set that up

    • @МаратЕлагин
      @МаратЕлагин 2 года назад

      you can add it to live templates in rider. Don't forget add space before //. In my case, without space it doesn't work

  • @zeljkobilandzija1748
    @zeljkobilandzija1748 4 года назад

    Great learning material. It would be great if we can find and download source code.

    • @nickchapsas
      @nickchapsas  4 года назад

      You can find the source in the video description

  • @olayemiafolabi2151
    @olayemiafolabi2151 4 года назад

    Hi Nick, I am interested in the advanced tutorial on unit testing

  • @claucometa
    @claucometa 4 года назад +1

    You say gooo weed... I know what you want dude.