2016-03-16 33 views
0

我现在完全重写了这个,因为我正坐在我的项目前面。我仍然有理解如何正确编写测试的问题。如何在nsubstitute模拟上测试set方法

这里是一流的,我想测试:

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:预期接收CA ll匹配:

添加(IVector3Proxy,IVector3Proxy) 实际上收到没有匹配的调用。 接受1不匹配的调用(用表示不匹配的参数“*”字符): 添加(IVector3Proxy,IVector3Proxy)

我希望有人能指出我做错了还是怎么,我误用NSubstitute。我迷失在如何测试这个方法

+0

我想我可能已经找到了我做错了,它在我使用get/set方法的VectorAdapter级别。如果我遇到任何问题,我会更新。基本上我是在每个get方法内部创建一个新的IVector3,而不是更新现有的IVector3,通过统一看起来不错,但是完全不可测试,所以它会出现 – ShaffDaddy

+0

仍然不工作:( – ShaffDaddy

回答

1

FollowCameraController构造函数采用player然后camera

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

但是你的测试实例化sutcamera然后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

谢谢!事实上,我有翻转这两个参数,甚至没有注意到它:(非常感谢你指出了这一点,我完全赞同这一点!现在我的测试已经过去了,我绝对同意我想测试的是摄像机位置与newCameraPosition相同。 – ShaffDaddy

相关问题