首页 > 解决方案 > 模拟 Get 方法在 mstest 中不起作用

问题描述

我有一个名为 EmployeeService 的业务类,它有一个方法 GetProjectsByEmpId 和代码如下

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

和 Get 方法 synatx 是

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>()}

我试图模拟所有可能的值,但我得到“参数计数不匹配”。错误。

如果我在这里做错了什么,请告诉我。提前感谢您的帮助和感谢。

标签: c#entity-frameworkmockingmstest.net-framework-version

解决方案


这是我的完整工作示例。您能否验证并告诉我我的解决方案和您的代码之间的区别?

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);
        }
    }
}

推荐阅读