[英]moq, how to test the save method?
我有一個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);
}
您正在嘲笑要測試的功能部分。 這些測試不會證明什么,除了您擁有用戶的數據類型的Add()
方法之外。 最后,它沒有給出任何有關存儲庫是否正常工作的想法。
您應該嘗試實現數據庫沙盒以測試您的存儲庫功能。
永遠不要為模擬代碼編寫測試,因為這些測試實際上不會測試任何東西(嗯,除了模擬框架實現之外)。
如何使用測試優先方法創建接口? 這很容易。 考慮您有一些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
接口,控制器需要IBarRepository
接口。 您創建此接口。 並且您還將方法GetById
添加到此接口。 之后,您實現控制器。
好消息-控制器完成后,您將擁有IBarRepository
接口定義,該接口具有非常便於控制器使用的API。
下一步是創建IBarRepository
實現。 我很少為存儲庫編寫測試。 但是,您可以采用以下幾種方法:
您的存儲庫保存在哪里? 如果要保存在某個文件中,則可以將其與某些模型文件(金)進行比較,其中所有文件均已手動檢查並且可以。 如果是某個數據庫,則應模擬數據庫界面,記錄所有插入查詢,然后將日志與理想日志進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.