Mock an update method returning a void with Moq

C#.NetMockingMoq

C# Problem Overview


In my test, I defined as data a List<IUser> with some record in.

I'd like setup a moq the methode Update, this method receive the user id and the string to update.

Then I get the the IUser and update the property LastName

I tried this :

namespace Tests.UnitTests
{
    [TestClass]
    public class UsersTest
    {
        public IUsers MockUsersRepo;
        readonly Mock<IUsers> _mockUserRepo = new Mock<IUsers>();
        private List<IUser> _users = new List<IUser>();

        [TestInitialize()]
        public void MyTestInitialize()
        {
            _users = new List<IUser>
                {
                    new User { Id = 1, Firsname = "A", Lastname = "AA", IsValid = true },
					new User { Id = 1, Firsname = "B", Lastname = "BB", IsValid = true }
                };

			Mock<IAction> mockUserRepository = new Mock<IAction>();
			_mockUserRepo.Setup(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()))
				.Returns(???);
				
            MockUsersRepo = _mockUserRepo.Object;
        }

        [TestMethod]
        public void Update()
        {
			//Use the mock here
        }

    }
}

But I get this error : cannot resolve Returns symbole

Do you have an id ?

class User : IUser
{
    public int Id { get; set; }
    public string Firsname { get; set; }
    public string Lastname { get; set; }
	public bool IsValid { get; set; }
}

interface IUser
{
    int Id { get; set; }
    string Firsname { get; set; }
    string Lastname { get; set; }
	bool IsValid { get; set; }
}

interface IAction
{
    List<IUser> GetList(bool isActive);
	void Update(int id, string lastname)
}

class Action : IAction
{
    public IUser GetById(int id)
    {
        //....
    }
    public void Update(int id, string lastname)
    {
		var userToUpdate = GetById(id);
		userToUpdate.LastName = lastname;
        //....
    }
}

C# Solutions


Solution 1 - C#

If you just want to verify this method is called, you should use Verifiable() method.

_mockUserRepository.Setup(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()))
                   .Verifiable();

If you also want to do something with those parameters, use Callback() first.

_mockUserRepository.Setup(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()))
                   .Callback((int id, string lastName) => {
                       //do something
                       }).Verifiable();

Update

Here's how you should mock it if you return a bool value as result.

_mockUserRepository.Setup(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()))
                   .Returns(true);

Solution 2 - C#

Mock<IUsers> _mockUserRepository = new Mock<IUsers>();
        _mockUserRepository.Setup(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()))
                            .Callback((int id, string name) =>
                                {
                                    //Your callback method here
                                });
 //check to see how many times the method was called
 _mockUserRepository.Verify(mr => mr.Update(It.IsAny<int>(), It.IsAny<string>()), Times.Once());

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKris-IView Question on Stackoverflow
Solution 1 - C#Ufuk HacıoğullarıView Answer on Stackoverflow
Solution 2 - C#Vyacheslav VolkovView Answer on Stackoverflow