Метод Mock for Get не работает в mstest - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть бизнес-класс EmployeeService, и у него есть один метод GetProjectsByEmpId, а код следует

    public List<Project> GetProjectsByEmpId (int id) {
       return this.empRepository.Get(e=>e.empId == id, e=>e.Projects).Projects;
   }

, а синтаксис метода Get равен

T Get(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes);

, а мой тестовый случай равен

private Mock<IEmployeeRepository> mockEmpRep;
 [TestInitialize]
        public void setup()
        {
            mockEmpRep= new Mock<IEmployeeRepository>();
            myClass= new EmployeeService(mockEmpRep.Object);            
        }

, метод тестирования -

 [TestMethod]
    public void Test_GetProjectsByEmpId() {
    this.mockEmpRep.Setup(m=> m.Get(
    It.IsAny<Expression<Func<Employee, bool>>>(),
                    It.IsAny<Expression<Func<Employee, object>>>())).Returns(mockResult);
    var res = myClass.GetProjectsByEmpId(1);
    }

, а mockResult -

new Employee { id: 1, projects: List<Project>()}

Я пытаюсь смоделировать все возможные значения, но получаю «Несоответствие счетчика параметров». ошибка.

Подскажите, пожалуйста, если я здесь что-то не так делаю. Благодарим Вас за помощь и заранее.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Это версия кода, который я запускал локально и может подтвердить, что работает.

public class EmployeeService
{
    private readonly IEmployeeRepository empRepository;

    public EmployeeService(IEmployeeRepository empRepository)
    {
        this.empRepository = empRepository;
    }

    public List<Project> GetProjectsByEmpId(int id)
    {
        return this.empRepository.Get<Employee>(e => e.empId == id, e => e.Projects).Projects;
    }
}

public class Employee
{
    public int empId { get; set; }
    public List<Project> Projects { get; set; }
}

public class Project
{
}

public interface IEmployeeRepository
{
    T Get<T>(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes);
}

[TestClass]
public class EmployeeServiceTests
{
    private Mock<IEmployeeRepository> mockEmpRep;
    private EmployeeService myClass;

    [TestInitialize]
    public void setup()
    {
        mockEmpRep = new Mock<IEmployeeRepository>();
        myClass = new EmployeeService(mockEmpRep.Object);
    }

    [TestMethod]
    public void Get()
    {
        // Arrange
        var mockResult = new Employee()
        {
            empId = 1,
            Projects = new List<Project>()
            {
                new Project()
            }
        };

        mockEmpRep.Setup(m => 
            m.Get(It.IsAny<Expression<Func<Employee, bool>>>(), 
                  It.IsAny<Expression<Func<Employee, object>>>())).Returns(mockResult);

        // Act
        var result = myClass.GetProjectsByEmpId(1);

        // Assert
        Assert.AreEqual(1, result.Count);
    }
}
1 голос
/ 06 апреля 2020

Вот мой полный рабочий пример. Не могли бы вы проверить и сказать мне разницу между моим решением и вашим кодом?

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

namespace UnitTestProject1
{
    public class Project { }

    public class Employee
    {
        public int EmpId { get; set; }
        public List<Project> Projects { get; set; }
    }

    public class EmployeeService
    {
        readonly IEmployeeRepository<Employee> empRepository;

        public EmployeeService(IEmployeeRepository<Employee> repository)
        {
            empRepository = repository;
        }

        public List<Project> GetProjectsByEmpId(int id)
        {
            return empRepository.Get(e => e.EmpId == id, e => e.Projects).Projects;
        }
    }

    public interface IEmployeeRepository<T>
    {
        T Get(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includes);
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mockEmpRep = new Mock<IEmployeeRepository<Employee>>();
            var mockResult = new Employee() { Projects = new List<Project> { new Project() } };

            mockEmpRep.Setup(
                x => x.Get(
                    It.IsAny<Expression<Func<Employee, bool>>>(),
                    It.IsAny<Expression<Func<Employee, object>>>())
                ).Returns(mockResult);

            EmployeeService myClass = new EmployeeService(mockEmpRep.Object);
            List<Project> result = myClass.GetProjectsByEmpId(1);

            Assert.AreEqual(1, result.Count);
        }
    }
}
...