【问题标题】:Verifying a Moq call for a reference [duplicate]验证 Moq 调用以获取参考 [重复]
【发布时间】:2019-02-26 02:15:16
【问题描述】:

更新每个重复标签,标记的重复主要是谈论使用 ref 或 out 设置 moq 对象,而不是真正如何验证它们。我看到我可以在验证语句中使用 ref It.Ref.IsAny,但我想验证值是否设置正确,而不仅仅是调用了该方法。

我正在尝试为一些遗留代码编写测试用例,这是一种调用存储库进行插入但存储库方法接受对对象的引用的方法。所以我要测试的方法的基本流程:

  1. 在 Nunit 中调用服务方法
  2. Service方法根据传入的参数创建对象
  3. 服务调用存储库进行插入
  4. 服务方法不返回任何内容

使用 Moq,我设置了一个模拟存储库类,并且我能够验证它是否确实进行了调用,但我希望能够验证它是否正确生成了对象。我正在构建一个相同的对象并尝试这样的验证调用:

_mockWorkerRepository.Verify(w => w.Create(ref newWorker), Times.Once);

我的测试用例抛出一个不匹配的错误。单步执行代码我可以验证两个对象是否相同,但我猜是因为我传入了引用,所以引用不同?有什么想法吗?谢谢!

更新以包含完整的测试方法和被测方法:

[Test]
public void ConfirmWorker_ShouldCreateWorker()
{
//Arrange
Worker worker = null;
var newWorker = new Worker
{
    Name = $@"{_machineName.ToLower()} worker",
    StatusId = WorkerStatus.OFFLINE,
    TypeId = WorkerType.TYPE,
    MessageQueueAddress = $@"FORMATNAME:DIRECT=OS:{_machineName}\private$\{_queueName}",
    HostProcessIdentifier = _testConfig.HostId,
    Created = _testTime,
    CreatedBy = "createdBy",
    LastUpdated = _testTime,
    LastUpdatedBy = "updatedBy",
    LastCheckinDate = _testTime
};

_mockWorkerRepository.Setup(w => w.GetByHostId(It.IsAny<string>())).Returns(worker);
_mockDateTimeRepository.Setup(d => d.UtcNow()).Returns(_testTime);

var workerService = new WorkerService(_mockDateTimeRepository.Object, _mockJobRepository.Object, _mockJobWorkerRepository.Object, _mockLogger.Object, _mockQueueRepository.Object, _mockWorkerRepository.Object, _testConfig);

//Act
workerService.ConfirmWorker(_machineName, _queueName);

//Assert
_mockWorkerRepository.Verify(w => w.Create(ref newWorker), Times.Once); 
_mockLogger.Verify(l => l.WriteLog("Worker registered in database"), Times.Once);
}


public void ConfirmWorker(string machineName, string queueName)
{
_logger.WriteLog($"Checking to add Worker if didn't exist for: {_configSettings.HostId} with {queueName}");

var worker = _workerRepository.GetByHostId(_configSettings.HostId);

if (worker != null)
{
    _logger.WriteLog("Worker exist, skipping creation");
    return;
}

_logger.WriteLog("Instance of this worker not found, CREATING one.");

var newWorker = new Worker()
{
    Name = $@"{machineName.ToLower()} worker",
    StatusId = WorkerStatus.OFFLINE,
    TypeId = WorkerType.TYPE,
    MessageQueueAddress = $@"FORMATNAME:DIRECT=OS:{machineName}\private$\{queueName}",
    HostProcessIdentifier = _configSettings.HostId,
    Created = _dateTimeRepository.UtcNow(),
    CreatedBy = "createdBy",
    LastUpdated = _dateTimeRepository.UtcNow(),
    LastUpdatedBy = "updatedBy",
    LastCheckinDate = _dateTimeRepository.UtcNow()
};

_workerRepository.Create(ref newWorker);

_logger.WriteLog("Worker registered in database");
}

【问题讨论】:

  • 你能用 ref 显示正在测试的代码,以帮助我更好地理解问题。你是如何设置接受 ref 的模拟成员的?
  • 我添加了完整的测试方法和被测方法,有什么问题可以告诉我!

标签: c# nunit moq


【解决方案1】:

您可以使用It.Is&lt;&gt;,它允许您指定使用一组特定参数进行的调用。

_mockWorkerRepository.Verify(w => w.Create(It.Is<NewWorker>(x => x.Variable == "mytestvariable")), Times.Once);

【讨论】:

  • 当我尝试这样做时,我收到一条消息说 ref 或 out 值必须是分配的变量。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2011-07-11
  • 2011-06-24
  • 2012-11-09
  • 1970-01-01
相关资源
最近更新 更多