0

I have these three lines of c# code using Moq, how can I write a single line?

  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));

Thanks for the help.

4

2 回答 2

1

There is a piece of code you are asking for

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

And a test that tests how it works

[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);
    }
}
于 2013-10-07T18:52:53.113 回答
0

You can easily create an extension method to do that as below.

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));
    }

Callback extension method:

   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();
            }
        }
   }

Sut (System Under Test) and other classes:

   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);
       }
   }
于 2013-10-07T20:10:22.190 回答