Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write a unit test for a repository update method?

I am getting started with unit testing using xUnit.net and Moq. I am writing a test method for the Update() method in AppService:

public class AppService : IAppService
{
   public virtual void Update(App entity)
   {
       if (entity == null)
       {
           throw new ArgumentNullException("App");
       }
       _appRepository.Update(entity);
       _cacheManager.Remove(Key);
   }
}

_appRepository and _cacheManager derive from interfaces IRepository<App> and ICacheManager, respectively. I am using moq to create mocks of these objects in my unit test, shown below:

[Fact]
public void UpdateTest()
{
     mockAppRepository = new Mock<IRepository<App>>();
     mockCacheManager = new Mock<ICacheManager>();

     // how to setup mock?
     // mockAppRepository.Setup();

     AppService target = new AppService(mockAppRepository.Object, 
          mockCacheManager.Object);
     App entity = new App();
     target.Update(entity);

     Assert.NotNull(entity);
}

I understand I need the mock to simulate that an update in the repository succeeded, specifically the call to _appRepository.Update(entity);

My question is, what is the best way to do this? Should I just use a Callback method when I call Setup() on the mockAppRespository? Is it standard to create a dummy collection and set the expectation on the update method to modify the dummy collection?

like image 861
Michael Hornfeck Avatar asked Sep 05 '25 03:09

Michael Hornfeck


1 Answers

Usually a test as simple as this will do.

mockAppRepository.Verify(d=> d.Update(It.IsAny<App>()), Times.Once());

With Moq you only need to .Setup() a test like this if the return result is important.

Edit:
To illustrate throwing an exception, as per comments, you would do the following setup before running your code.

mockAppRepository.Setup(d=> d.Update(It.IsAny<App>())).Throws<Exception>();
like image 118
Chris Sainty Avatar answered Sep 08 '25 00:09

Chris Sainty