c# - 如何模拟返回接口(interface)列表的方法

标签 c# unit-testing mocking repository-pattern

这是我的存储库方法:

    public async Task<IList<IVehicleMake>> GetAllMakes()
    {
        var makes = Context.VehicleMakes.AsQueryable();

        return new List<IVehicleMake>(AutoMapper.Mapper.Map<List<VehicleMake>>(await makes.ToListAsync()));
    }

我知道如何模拟返回具体类型的方法,但正如您所看到的,该方法返回接口(interface)“IVehicleMake”的列表。

是否可以模拟这种方法以及如何模拟?

最佳答案

您可以简单地使用模拟框架,例如 Moq 。这与模拟一个简单的界面没有太大不同。

这里是使用 MS Test 和 Moq 的示例代码

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace UnitTestProject1
{
    public class Vehicle{}
    public interface IVehicleMake
    {
        Vehicle Make();
    }
    public interface IVehicleMakeRepository
    {
        Task<IList<IVehicleMake>> GetAllMakes();
    }

    public class MyService
    {
        private readonly IVehicleMakeRepository vehicleMakeRepository;

        public MyService(IVehicleMakeRepository vehicleMakeRepository)
        {
            this.vehicleMakeRepository = vehicleMakeRepository;
        }

        public async Task DoSomething()
        {
            var makes = await vehicleMakeRepository.GetAllMakes();
            foreach (var make in makes)
            {
                var vehicule = make.Make();
            }
        }
    }

    public class MyServiceTest
    {
        [TestClass]
        public class DoSomething
        {
            [TestMethod]
            public async Task Should_CallAllMakersOnce()
            {
                //Arrange
                var mockedMakers = new[] { new Mock<IVehicleMake>(), new Mock<IVehicleMake>(), };
                foreach (var mockedMaker in mockedMakers)
                {
                    mockedMaker.Setup(m => m.Make()).Returns(new Vehicle()).Verifiable();
                }
                var mockedRepository = new Mock<IVehicleMakeRepository>();
                mockedRepository
                    .Setup(m => m.GetAllMakes())
                    .ReturnsAsync(mockedMakers.Select(mm => mm.Object).ToList())
                    .Verifiable();
                var service = new MyService(mockedRepository.Object);
                //Act
                await service.DoSomething();
                //Assert
                mockedRepository.Verify(m => m.GetAllMakes(), Times.Once);
                foreach (var mockedMaker in mockedMakers)
                {
                    mockedMaker.Verify(m => m.Make(), Times.Once);
                }
            }
        }
    }
}

关于c# - 如何模拟返回接口(interface)列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51277915/

相关文章:

python - python 单元测试的基本测试用例类

asp.net-mvc - MVC 3 : Test controllers VS integration tests

c# - 我如何模拟我的网络服务?

testing - 如何在使用 Cypress 的 E2E 测试中登录 Auth0?

php - 如何检查模拟对象的方法不是仅使用特定参数调用的?

javascript - 需要互斥复选框或可取消选择的单选按钮

c# - 阻止代码并等待事件处理程序触发?

asp.net-mvc - 使用 MOQ 的单元测试 Controller 。如何模拟httpcontext

c# - 无法使用静态方法、实例方法等作为 .NET 中属性的参数的原因是什么?

c# - 任何人都知道如何使用 Array 中的逗号分隔列从字符串 Array 批量插入到 SQL