代码之家  ›  专栏  ›  技术社区  ›  Arthurdent510

验证参考的最小起订量调用[重复]

  •  0
  • Arthurdent510  · 技术社区  · 7 年前

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

    1. Nunit中的调用服务方法
    2. 服务方法根据传入的参数创建对象
    3. 服务调用存储库进行插入

    使用Moq,我已经设置了一个mocked repository类,并且我能够验证它是否确实执行了调用,但是我希望能够验证它是否正确地生成了对象。我正在构建一个相同的对象,并尝试如下验证调用:

    _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");
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Nick Spicer    7 年前

    你可以用 It.Is<> 它允许您指定一个调用是用一组特定的参数进行的。

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