我有一个save()方法,不太确定如何测试。下面是我的代码。
public interface IRepository<T>
{
T Get(int id);
void Save(T item);
void Delete(int id);
}
save方法不返回任何值,我无法比较该值。但是,我已经有4个用户,在添加另一个用户之后,我只检查用户总数,是否足以测试它?
[Test]
public void Add_a_new_smoothie_user_should_return_total_5_users()
{
// Arrange
var totalUsers = _users.Count();
_mockUserRepository.Setup(s => s.Save(It.IsAny<User>()))
.Callback((User user) => _users.Add(user));
var newUser = new User
{
Id = 3,
Email = "newuser@test.com",
Password = "1234567".Hash(),
Firstname = "",
Lastname = "",
CreatedDate = DateTime.Now,
LastLogin = DateTime.Now,
AccountType = AccountType.Smoothie,
DisplayName = "",
Avatar = "",
ThirdPartyId = "",
Status = Status.Approved,
Ip = "127.0.0.1"
};
// Act
_mockUserRepository.Object.Save(newUser);
// Assert
Assert.AreEqual(5, _users.Count());
Assert.AreEqual(1, _users.Count() - totalUsers);
}
答案 0 :(得分:3)
您正在嘲笑您要测试的功能部分。除了您持有用户的数据类型的Add()
方法之外,这些测试都不会被证明。最后,如果您的存储库正在运行,它不会给出任何想法。
您应该尝试实施Database Sandbox来测试您的存储库功能。
答案 1 :(得分:1)
永远不要为模拟代码编写测试,因为那些测试实际上并没有测试任何东西(好吧,除了模拟框架实现)。
如何使用测试优先方法创建接口?这很简单。考虑您有一些FooController
,这需要一些数据。在某些时候(在为控制器编写测试期间),您决定会有一些依赖关系,它会将这些数据提供给控制器(是的,存储库)。您当前的控制器测试需要一些功能才能从数据存储中获取一些Bar
对象。所以,你写测试
Mock<IBarRepository> repositoryMock = new Mock<IBarRepository>();
repositoryMock.Setup(r => r.GetById(It.IsAny<int>()).Returns(new Bar());
FooController controller = new FooController(repositoryMock.Object);
controller.Exercise();
此测试无法编译,因为此时您没有控制器需要的IBarRepository
接口。您创建此接口。您还可以在此界面中添加方法GetById
。之后,您实现控制器。
好消息 - 当控制器完成后,您将拥有IBarRepository
接口定义,其中API非常便于控制器使用。
下一步是创建IBarRepository
实施。我很少为存储库编写测试。但是,您可以通过以下几种方式实现:
答案 2 :(得分:0)
您的存储库正在保存?如果它保存在某个文件中,那么您可以将您的文件与某些模型文件(黄金)进行比较,其中一切都是手动检查并且没问题。如果是某个数据库,则应该模拟数据库接口,记录所有插入查询,然后将日志与理想日志进行比较。