Kiril Velichkov
Kiril Velichkov

Reputation: 45

Setup a mocked EF Service method

I have the following method in my NewsDataService class

public IEnumerable<NewsModel> GetImportantNews()
{
    var result = this.newsfeedRepository.GetAll(
        x => x.IsImportant == true,
        x => new NewsModel()
        {
            Creator = x.User.UserName,
            AvatarPictureUrl = x.User.AvatarPictureUrl,
            Content = x.Content,
            CreatedOn = x.CreatedOn
        })
        .OrderByDescending(x => x.CreatedOn);

    return result;
}

My question is... How do I setup the mocked service method (GetImportantNews), so that it returns a list of NewsModel which are "Important"?

My idea is something like this, but it is not working so far, because it is always returning the full list.

var expectedResult = new List<Newsfeed>()
{
    new Newsfeed()
    {
       IsImportant = false,
    },
    new Newsfeed()
    {
        IsImportant = true
    }
};
mockedNewsfeedRepository
    .Setup(x => x.GetAll(
        It.IsAny<Expression<Func<Newsfeed, bool>>>(),
        It.IsAny<Expression<Func<Newsfeed, NewsModel>>>()
    )).Returns(expectedResult);

Basically what I want is my "expectedResult" to be filtered by the logic in the method.

Upvotes: 1

Views: 45

Answers (1)

Nkosi
Nkosi

Reputation: 247521

You have access to the invocation arguments when returning a value. Apply the predicate and projection expression arguments to the fake data source using linq like in the example below.

mockedNewsfeedRepository
    .Setup(x => x.GetAll(
        It.IsAny<Expression<Func<Newsfeed, bool>>>(),
        It.IsAny<Expression<Func<Newsfeed, NewsModel>>>()
    ))
    // access invocation arguments when returning a value
    .Returns((Expression<Func<Newsfeed, bool>> predicate, Expression<Func<Newsfeed, NewsModel>> projection) =>
         expectedResult.Where(predicate.Compile()).Select(projection.Compile())
    );

Source: Moq Quickstart

Upvotes: 2

Related Questions