Setting up NSubstitute Mock for functions that implement asp.net core IMemoryCache

Viewed 274

I have a function that returns a status like this:

public async Task<Result> UpdateWeight(string id, int weight)
        {
            var data = await service.GetData(id);

            if (data != null)
            {
                var user = await GetInfo(data.UserId);

                var changedWeight = await UpdateWeight(newWeight, user);

                if (!changedWeight)
                {
                    return new ChangeWeightResult("Weight not updated");
                }

                return new ChangeWeightResult(newWeight);
            }

            return new ChangeWeightResult("Error changing weight");
        }

And I'm trying to set up a unit test (xUnit - NSubstitute) for it.

public async Task UpdateUserAvatar_WhenCalled_ReturnChangedAvatarSuccess()
        {
            //Arrange
            var id = "id";
            var newWeight = 30;

            var data = new DataEntity
            {
                Id = id
            };

            var user = new User
            {
                UserId = "id"
            };


            service.GetData(Arg.Any<string>()).Returns(data);
            service.GetUser(Arg.Any<string>()).Returns(user);


            //Act
            var result = await service.UpdateWeight(data.Id, newWeight;
            

            //Assert
            result.IsSuccessful.Should().BeTrue();
            result.Weight.Should().Be(newWeight);

        }

However I keep stumble upon error such as null for the memory cache (CacheEntryFake) when I don't return the User or "Cannot return value of type Task 1 for IMemoryCache.CreateEntry"

These are all the functions that I called within the function that I want to test

public async Task<DataEntity> GetData(string id)
        {
            var data = await memoryCache.GetOrCreateAsync(id, CacheFactory);

            return data;
        }
internal async Task<DataEntity> CacheFactory(ICacheEntry cache)
        {
            var data = await GetDataFromDb(cache.Key.ToString());

            if (IsExpiredSession(data))
            {
                cache.Dispose();
            }
            else
            {

                cache.SetAbsoluteExpiration(relative);
            }

            return data;
        }
private async Task<bool> GetInfo(string id)
        {
            if(setting.CacheTimeout > 0)
            {
              return await 
           memoryCache.GetOrCreateAsync(id, InfoCacheFactory):
            }
           
            return id;
        }
0 Answers
Related