Как смоделировать функцию в модульном тесте - PullRequest
0 голосов
/ 03 июля 2018

Как я могу протестировать GetData по NMock3?

Было бы замечательно, если prcessA.Run и «результат» внутри ProcessA могут быть посмешищем.

IAnotherService не может быть параметром GetData, так как он зависит от обработанного значения внутри GetData.

Есть идеи?

Service1

public class Service1 : IService1
{
    public Service1()
    {
    }

    public string GetData(int a)
    {
        // some process depends on input
        int b = a * new Random().Next();

        IAnotherService anotherService = new AnotherService(b);
        ProcessA processA = new ProcessA(anotherService);
        processA.Run();
        return processA.result;
    }
}

Упрощенный процесс A

public class ProcessA
{
    public string result;
    private IAnotherService anotherService;

    public ProcessA(IAnotherService anotherService)
    {
        this.anotherService = anotherService;
    }

    public void Run()
    {
        // Some other process here
        this.result = this.anotherService.Run();
    }
}

TestMethod1

[TestMethod]
public void TestMethod1()
{
    using (mockFactory.Ordered())
    {
        // Nothing to Mock
    }

    IService1 service1 = new Service1();
    string aaa = service1.GetData(1);

    Assert.AreEqual("XXX", aaa);
}

1 Ответ

0 голосов
/ 03 июля 2018

Как уже говорилось, вам нужно смоделировать зависимые сервисы и настроить то, что вы ожидаете получить.

Я сделал тест ниже, и он работает. Я использую Moq, но основной принцип тот же.

 public interface IAnotherService
 {
     string Run();
 }

public class ProcessA
{
    public string result;
    private readonly IAnotherService _anotherService;

    public ProcessA(IAnotherService anotherService)
    {
        this._anotherService = anotherService;
    }

    public string Run()
    {
        // Some other process here
        return _anotherService.Run();
    }   
}

Затем запустите тест

[Test]
public void TestMethod1()
{
   //Create a Mock
   var mockService = new Mock<IAnotherService>();
   //Set the expected result
   mockService.Setup(method => method.Run()).Returns("XXX");

   //Inject the mock
   var process = new ProcessA(mockService.Object);
   var result = process.Run();

   //Assert the result     
   Assert.AreEqual("XXX", result);
}

EDIT

Как уже говорилось, я отредактировал свой ответ, надеясь, что вам нужно.

 public interface IService1
    {
        string GetData(int a);
        int ValueForB { get; set; }
    }

public class Service1Consumer : IService1
{
    private readonly IAnotherService _anotherServiceImplementation;

    public Service1Consumer(IAnotherService service)
    {
        _anotherServiceImplementation = service;
    }

    public string GetData(int a)
    {
        ValueForB = a * new Random().Next();
        _anotherServiceImplementation.ValueFor = b;
        var processA = new ProcessA(_anotherServiceImplementation);
        return processA.Run();
    }
}

public interface IAnotherService
{
    int ValueForB { get; set; }
}

public class AnotherService : IAnotherService
{
}

public class ProcessA
{
    public string result;
    private readonly IAnotherService _anotherService;

    public ProcessA(IAnotherService anotherService)
    {
        _anotherService = anotherService;
    }

    public string Run()
    {
        return "XXXX";
    }
}

Тогда тест.

  [Test]
  public void TestMethod1()
  {
      //Create a Mock
      var mockAnotherService = new Mock<IAnotherService>();
      //Set the property value when called.
      mockAnotherService.Setup(method => method.ValueForB).Returns(10);//Test 1

      var service1Consumer = new Service1Consumer(mockAnotherService.Object);
      var result = service1Consumer.GetData();

      Assert.AreEqual("XXXX",result);

   }

Надеюсь, это направит вас в правильном направлении. Спасибо

...