C# 服务层上的Moq测试错误为Null

C# 服务层上的Moq测试错误为Null,c#,.net,moq,C#,.net,Moq,如何纠正以下测试以使其正常工作 [TestMethod()] public void GetEmployeeProductivityTest() { var mockHR=new Mock(); var mockCMS=new Mock(); mockCMS.Setup(repos=>repos.findeemployeebyusername(It.IsAny()).Verifiable(); Employee newEmp=新员工(); newEmp.User_Name=“testName”;

如何纠正以下测试以使其正常工作

[TestMethod()]
public void GetEmployeeProductivityTest()
{
var mockHR=new Mock();
var mockCMS=new Mock();
mockCMS.Setup(repos=>repos.findeemployeebyusername(It.IsAny()).Verifiable();
Employee newEmp=新员工();
newEmp.User_Name=“testName”;
var服务=新员工服务(mockHR.Object、mockCMS.Object);
var createResult=service.GetEmployeeByUserName(newEmp);
AreEqual(newEmp、createResult);
mockCMS.VerifyAll();
}
我得到以下信息:

Assert.AreEqual failed. Expected:<Employee>. Actual:<(null)>.
Assert.AreEqual失败。预期:。实际值:。
根据请求,这是正在调用的GetEmployeeByUserName()函数:

public Employee GetEmployeeByUserName(Employee employee)
{
    return _employeeRespository.Find().ByUserName(employee); <------(Using Strict: Gives me the following:  All invocations on the mock must have a corresponding setup.)
}
public Employee GetEmployeeByUserName(员工)
{

return _employeeRespository.Find().ByUserName(employee);您需要为mock的
findeemployeebyusername()
方法设置种子:

mockCMS.Setup(repos => repos.FindEmployeeByUsername(It.IsAny<string>())).Returns(newEmp);
mockCMS.Setup(repos=>repos.FindEmployeeByUsername(It.IsAny()).Returns(newEmp);

否则,当在EmployeeService中调用时,它将不会返回预期的对象。

而不是使用我认为令人困惑的多个存储库。我简化了它,现在它可以工作了!但我仍然不确定这如何帮助我更好地编写代码。我用它完成了什么?(我对测试/Moq/集成测试……等不熟悉)我真的很想得到一个答案

public void GetEmployeeUsername_Using_EmployeeClass()
{
    var mockCMS = new Mock<ICMS_Repository>(MockBehavior.Strict);

    Employee newEmp = new Employee();
    newEmp.User_Name = "testName";

    mockCMS.Setup(repos => repos.FindEmployeeByUsername(It.IsAny<Employee>())).Returns(newEmp);

    var service = new EmployeeService(mockCMS.Object);
    var createResult = service.GetEmployeeByUserName(newEmp);

    Assert.AreEqual(newEmp, createResult);
}
public void GetEmployeeUsername\u使用\u EmployeeClass()
{
var mockCMS=新的Mock(MockBehavior.Strict);
Employee newEmp=新员工();
newEmp.User_Name=“testName”;
mockCMS.Setup(repos=>repos.findeemployeebyusername(It.IsAny()).Returns(newEmp);
var服务=新员工服务(mockCMS.Object);
var createResult=service.GetEmployeeByUserName(newEmp);
AreEqual(newEmp、createResult);
}

由于您编辑了问题以显示
GetEmployeeByUserName
的行为,现在很容易解释测试失败的原因

mockCMS.Setup(repos => repos.FindEmployeeByUsername(It.IsAny<string>()))
对于像您的
GetEmployeeByUserName
这样的简单方法,模拟依赖项和单元测试似乎会带来很大的开销

"when someone calls the GetEmployeeByUserName method on the EmployeeService, 
the service should call the correct method on its repository"

这是一个重要的断言吗?这取决于您的决定。然而,随着服务方法复杂性的增加,能够隔离依赖项并测试它们的交互将变得越来越有价值。

使用MockBehavior。严格的模拟构造函数可能有助于您准确跟踪调用的方法在你的mock repo上,以及它返回null的原因。否则,你需要向我们展示GetEmployeeByUserName方法。好的。我通过严格的方式得到这个。mock上的所有调用都必须有相应的设置。你不初始化mockHR是故意的吗?你能发布GetEmployeeByUserName()的实现吗?堆栈溢出是针对特定编程问题的问题。要了解模拟和单元测试的好处,您可能需要阅读(例如),或在程序员堆栈交换网站上提问。
"when someone calls the GetEmployeeByUserName method on the EmployeeService, 
the service should call the correct method on its repository"