2013-10-07 133 views
0

我有這三行使用Moq的c#代碼,我該如何寫一行代碼?Moq回調調用參數

JobQueueRepository.Setup(r => r.UpdateJobQueueStatus(DefaultJobId, JobStatus.Success)).Callback(() => statuses.Add(JobStatus.Success)); 
    JobQueueRepository.Setup(r => r.UpdateJobQueueStatus(DefaultJobId, JobStatus.Failed)).Callback(() => statuses.Add(JobStatus.Failed)); 
    JobQueueRepository.Setup(r => r.UpdateJobQueueStatus(DefaultJobId, JobStatus.Running)).Callback(() => statuses.Add(JobStatus.Running)); 

感謝您的幫助。

回答

1

有一段代碼,你所要求的

JobQueueRepository 
     .Setup(it => it.UpdateJobQueueStatus(DefaultJobId, It.IsAny<JobStatus>())) 
     .Callback<int, JobStatus>((id, status) => statuses.Add(status)); 

和測試,測試它是如何工作

[TestClass] 
public class TestClass 
{ 
    [TestMethod] 
    public void TestMethod() 
    { 
     var statuses = new List<JobStatus>(); 
     var JobQueueRepository = new Mock<IJobQueueRepository>(); 
     int DefaultJobId = 100500; 

     JobQueueRepository 
      .Setup(it => it.UpdateJobQueueStatus(DefaultJobId, It.IsAny<JobStatus>())) 
      .Callback<int, JobStatus>((id, status) => statuses.Add(status)); 

     JobQueueRepository.Object.UpdateJobQueueStatus(DefaultJobId, JobStatus.Failed); 
     JobQueueRepository.Object.UpdateJobQueueStatus(DefaultJobId, JobStatus.Running); 
     JobQueueRepository.Object.UpdateJobQueueStatus(DefaultJobId, JobStatus.Success); 

     statuses.Should().HaveCount(3); 
     statuses.Should().Contain(JobStatus.Failed); 
     statuses.Should().Contain(JobStatus.Running); 
     statuses.Should().Contain(JobStatus.Success); 
    } 

    public enum JobStatus 
    { 
     Success, 
     Failed, 
     Running 
    } 

    public interface IJobQueueRepository 
    { 
     void UpdateJobQueueStatus(int id, JobStatus status); 
    } 
} 
+0

謝謝,您的解決方案是什麼,我一直在尋找。我錯過了回調的簽名。 – MicheleFG

0

您可以輕鬆創建一個擴展方法,這樣做如下。

public class Class1 
{ 
    [Test] 
    public void CallBackDemo() { 

     var statuses = new List<JobStatus>(); 
     var jobQueueRepositoryStub = new Mock<IJobQueueRepository>(); 
     const int defaultJobId = 100500; 

     jobQueueRepositoryStub.Setup(r => r.UpdateJobQueueStatus(defaultJobId, JobStatus.Success)) 
      .Callback(new Action[] 
       { 
        () => statuses.Add(JobStatus.Success), 
        () => statuses.Add(JobStatus.Failed), 
        () => statuses.Add(JobStatus.Running) 
       }); 

     var sut = new Sut(jobQueueRepositoryStub.Object); 

     sut.Do(defaultJobId); 

     Assert.True(statuses.Count == 3); 
     Assert.True(statuses.Any(x => x == JobStatus.Failed)); 
     Assert.True(statuses.Any(x => x == JobStatus.Running)); 
     Assert.True(statuses.Any(x => x == JobStatus.Success)); 
    } 

回調擴展方法:

public static class Ext 
    { 
     public static void Callback<TRepo>(this ISetup<TRepo> repo, IEnumerable<Action> actions) where TRepo : class { 
      foreach (var action in actions) { 
       action(); 
      } 
     } 
    } 

蘇特(待測系統)和其他類:

public enum JobStatus { Success, Failed, Running } 

    public interface IJobQueueRepository { 
     void UpdateJobQueueStatus(int id, JobStatus status); 
    } 

    public class Sut { 
     private readonly IJobQueueRepository _repository; 

     public Sut(IJobQueueRepository repository) { 
      _repository = repository; 
     } 

     public void Do(int jobId) { 
      _repository.UpdateJobQueueStatus(jobId, JobStatus.Success); 
      _repository.UpdateJobQueueStatus(jobId, JobStatus.Failed); 
      _repository.UpdateJobQueueStatus(jobId, JobStatus.Running); 
     } 
    }