2016-03-16 2 views
0

Я полностью переписываю это сейчас, когда сижу перед моим проектом. У меня все еще проблема с пониманием того, как правильно написать тест.Как проверить метод набора на nsubstitute mock

Вот класс Я пытаюсь тест:

namespace Snowball.Controllers 
{ 
    public class FollowCameraController : ICameraController 
    { 
     private ITransform player; 
     private ITransform camera; 
     private IVector3Utility utility; 
     private IVector3 offset; 

     public FollowCameraController(ITransform player, ITransform camera, IVector3Utility utility) 
     { 
      this.player = player; 
      this.camera = camera; 
      this.utility = utility; 

      offset = utility.Subtract(camera.Position, player.Position); 
     } 

     public void UpdateCameraPosition() 
     { 
      IVector3 playerPosition = player.Position; 

      IVector3 newCameraPosition = utility.Add(playerPosition, offset); 

      camera.Position = newCameraPosition; 
     } 
    } 
} 

Вот набор тестов, которые я бегу, и это единственный тест в наборе прямо сейчас, что я пытаюсь тест:

namespace FrameworkTests 
{ 
    [TestFixture] 
    public class FollowCameraControllerTest 
    { 
     private ITransform cameraTransformMock; 
     private ITransform playerTransformMock; 
     private IVector3Utility utilityMock; 

     private IVector3 offset; 

     private FollowCameraController sut; 

     [SetUp] 
     public void Init() 
     { 
      cameraTransformMock = Substitute.For<ITransform>(); 
      playerTransformMock = Substitute.For<ITransform>(); 
      utilityMock = Substitute.For<IVector3Utility>(); 

      offset = Substitute.For<IVector3>(); 

      utilityMock.Subtract(Arg.Any<IVector3>(), Arg.Any<IVector3>()).Returns(offset); 

      sut = new FollowCameraController(cameraTransformMock, playerTransformMock, utilityMock); 

      var temp = utilityMock.Received().Subtract(Arg.Any<IVector3>(), Arg.Any<IVector3>()); 
     } 

     [Test] 
     public void WhenUpdateCameraIsCalledThenCameraPositionIsUpdated() 
     { 
      //var playerPosition = Substitute.For<IVector3>(); 
      var cameraPosition = Substitute.For<IVector3>(); 

      var playerPosition = playerTransformMock.Position; 

      utilityMock.Add(playerPosition, offset).Returns(cameraPosition); 

      //var temp = cameraTransformMock.Position; 
      //cameraTransformMock.Position = cameraPosition; 

      sut.UpdateCameraPosition(); 

      var temp = playerTransformMock.Received().Position; 
      temp = utilityMock.Received().Add(playerPosition, offset); 
      //cameraTransformMock.Received().Position = cameraPosition; 
     } 
    } 
} 

Этого тест не со следующим неудачным выходом теста:

результата Сообщение: NSubstitute.Exceptions.ReceivedCallsException: Ожидаются получить ки Соответствие:

Добавить (IVector3Proxy, IVector3Proxy) Фактически не было получено соответствующих вызовов. Поступила 1 несовпадающих вызов (аргументы, не совпадающие, отмеченные «*» символов): Добавить (IVector3Proxy, IVector3Proxy)

Я надеюсь кто-то может указать на то, что я сделал неправильно или как я злоупотребляя NSubstitute. Я теряюсь о том, как проверить этот метод

+0

Я думаю, что я мог бы узнал, что я делал неправильно, и это было на уровне VectorAdapter, где я использую методы get/set. Я буду обновлять, если у меня возникнут проблемы. По сути, я создавал новый IVector3 внутри каждого метода get вместо того, чтобы просто обновлять exector IVector3, выглядел хорошо через единство, но был абсолютно неустойчивым или так выглядел – ShaffDaddy

+0

Все еще не работает :( – ShaffDaddy

ответ

1

FollowCameraController конструктор принимает player затем camera:

public FollowCameraController(ITransform player, ITransform camera, IVector3Utility utility) { ... } 

Но ваш тест инстанцирует sut с camera затем player:

sut = new FollowCameraController(cameraTransformMock, playerTransformMock, utilityMock); 

Я думаю, что это большая часть проблемы. :)

Как и в сторону, UpdateCameraPosition обновляет положение камеры, используя позицию игрока и экземпляр IVector3Utility, поэтому я хотел бы сделать, что фокус теста:

[Test] 
    public void WhenUpdateCameraIsCalledThenCameraPositionIsUpdated() 
    { 
     var newCameraPosition = Substitute.For<IVector3>(); 
     var playerPosition = playerTransformMock.Position; 
     utilityMock.Add(playerPosition, offset).Returns(newCameraPosition); 

     sut.UpdateCameraPosition(); 

     Assert.AreSame(cameraTransformMock.Position, newCameraPosition); 
    } 
+0

Спасибо! Это был тот факт, что у меня было flip flopped два параметра и даже не заметил его :(Большое спасибо за указание на это, я полностью надул это! Теперь мой тест проходит, и я абсолютно согласен с тем, что я хотел проверить, был тот факт, что камера положение было таким же, как и с новым параметромCameraPosition. – ShaffDaddy

Смежные вопросы