假设我的控制器类中有一个方法可以更新Redis数据库中键,值对的分数。我想编写一个单元测试来检查分数是否不为null并增加1。我只想查看单元测试如何与Redis一起使用,以及如何从特定键,值对中提取分数并检查其有效性。
控制器类//当用户刷新api / do / v1 / togglelike / {id}“时,该用户的分数将以Redis更新,并增加1;否则,该分数将增加1。
[HttpGet]
[Route("api/do/v1/togglelike/{id}")]
public IHttpActionResult ToggleLike(String id)
{
var currentUser = "mike";
var likeSet = redis1.SortedSetRangeByScore("likes:" + id);
var likeStatus = redis1.SortedSetScore("likes:" + id, currentUser);
//Current user has not yet liked the profile
if (likeStatus == null)
{
redis1.SortedSetAdd("likes:" + id, currentUser, 1);
return Ok("Like Added");
}
/*redis1.SortedSetAdd("likes:" + id, currentUser, 1);
return Ok("Like Added");*/
else
{
double counter = redis1.SortedSetIncrement("likes:" + id, currentUser, 1);
redis1.SortedSetAdd("likes:" + id, currentUser, counter);
return Ok("Like Added");
/*redis1.SortedSetRemove("likes:" + id, currentUser);
return Ok("Like Removed");*/
}
}
测试类:我想从键,值对中获取分数,并检查其是否等于有效数字;
namespace VideoControllerTest
{
[TestClass]
public class VideoControllerTest
{
IDatabase redis1;
public VideoControllerTest()
{
redis1 = RedisFactory.Connection.GetDatabase();
}
[TestMethod]
public void VideoController_Adview()
{
//Arrange
VideoController controller = new VideoController();
//Act
IHttpActionResult actionResult = controller.ToggleLike("video123");
//Assert; Check to see the counter is incremented by 1 and is not null;
}
}
}
为了能够对外部系统(在这种情况下为redis数据库)进行单元测试,您必须模拟外部系统。
如果redis1
接口是一个接口,则可以使用Mock这样的框架轻松地对其进行模拟,如果它是一种实现,则将很困难,并且必须使用自己的类将其包装以对其进行模拟。
您需要将IDatabase传递给控制器,因此我添加了另一个构造函数。
class VideoController
{
private IDatabase redis1;
public VideoController(IDatabase db)
{
this.redis1 = db;
}
}
测试方法应如下
//note : library used for mocking is moq (https://github.com/Moq/moq4)
[TestMethod]
public void VideoController_Adview()
{
//Arrange
Mock<IDatabase> mockRedis = new Mock<IDatabase>();
//set existing score as null
mockRedis.Setup(r => r.SortedSetScore(It.isAny<string>,It.isAny<string>)).Returns(null);
VideoController controller = new VideoController(mockRedis.Object);
//Act
IHttpActionResult actionResult = controller.ToggleLike("video123");
//verify added once
mockRedis.Verify(r => r.SortedSetAdd("likes:videio123",1), Times.Once());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句