gpt4 book ai didi

C# Moq 框架返回空引用不正确的对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:19:06 25 4
gpt4 key购买 nike

我在单元测试中遇到问题,我使用最小起订量框架来模拟我的数据库接口(interface)以返回数据集。问题是,当我调用 BLL 方法时,它返回 null 而不是我设置的对象。BLL代码为:

public ApplicationsManager(IApplicationsManagerDal applicationsManagerDal)
{
_applicationsManagerDal = applicationsManagerDal ?? throw new Exception("applicationsManagerDAL is null");
}

public IpApplication AddIpApplication(IpApplication ipApplication)
{

try
{
if (Validator.ExecuteValidation(ipApplication, new AddIpApplicationValidationRules()).ValidationFailures != null)
return ipApplication;

ipApplication = _applicationsManagerDal.AddIpApplication(ipApplication);

ipApplication.Status = CommonStatus.OperationOk;
}
catch (BaseException e)
{
ipApplication.Status = e.Status;
}
catch (Exception e)
{
ipApplication.Status = ExceptionHandler.SetStatusForException();

NLogger.LogException("IpApplication Name:" + ipApplication.Name, e);
}

return ipApplication;
}

我设置最小起订量的代码是:

var _mock = new Mock<IApplicationsManagerDal>();

_mock.Setup(a => a.AddIpApplication(new IpApplication
{
Code = new Guid("00000000-B935-4E12-9037-000000000000"),
Name = "APPLICATION_ZERO"
}))
.Returns(() => new IpApplication
{
Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D"),
Description = "Test application",
Enabled = true,
Name = "APPLICATION_ZERO",
});

单元测试是:

[TestMethod(), TestCategory("Unit")]
public void AddIpApplication_ValidRequest_IpApplicationSuccessfullyAdded()
{
// Arrange
_ipApplication = new IpApplication
{
Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D"),
Name = "APPLICATION_ZERO"
};

// Act AddIpApplication
_ipApplication = _applicationManager.AddIpApplication(_ipApplication);

Assert.IsTrue(_ipApplication.Code != Guid.Empty);
}

当测试调用 BLL 方法到达行时:

ipApplication = _applicationsManagerDal.AddIpApplication(ipApplication);

它总是返回空值。你能解释一下为什么吗?我如何获得设定值或如何更改单元测试?谢谢你,对不起我的英语不好

最佳答案

当模拟没有完全按照设置调用时,它不会按预期运行。

在您的情况下,您传递给模拟的实例/引用不同于模拟设置中使用的实例/引用。这将导致模拟在调用时返回 null(默认行为)。

为了更加灵活地传递参数,您可以使用 It.IsAny<IpApplication>()接受任何参数以及 Callback在提供的参数上设置所需的属性。这应该允许使用提供的模拟来执行被测方法。

_mock
.Setup(_ => _.AddIpApplication(It.IsAny<IpApplication>()))
.Callback((IpApplication arg) => { //<-- use call back to modify the provided parameter
arg.Code = new Guid("9631E691-B935-4E12-9037-2E874DB15B0D");
arg.Description = "Test application";
arg.Enabled = true;
arg.Name = "APPLICATION_ZERO";
})
.Returns((IpApplication arg) => arg); //<-- return provided parameter after Callback

//inject the mock into the subject under test.
_applicationManager = new ApplicationsManager(mock.Object);

引用 Moq Quickstart获取有关如何使用该框架的更多详细信息。

关于C# Moq 框架返回空引用不正确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com