簡體   English   中英

最小起訂量,如何測試保存方法?

[英]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實現。 我很少為存儲庫編寫測試。 但是,您可以采用以下幾種方法:

  • 如果您有數據訪問代碼,而該數據訪問代碼由存儲庫(ORM框架,ADO.NET類等)使用,則可以模擬這些依賴關系並驗證存儲庫實現對基礎數據訪問代碼進行了所有必需的調用。 這些測試非常脆弱。 而且不會給您帶來太多好處,因為很少有存儲庫包含復雜的業務邏輯。
  • 您可以對真實數據庫(例如內存中的SQLite)進行集成測試,並驗證數據庫表中的數據確實是CRUD版本。 這些測試也很脆弱並且非常耗時。 但是在這種情況下,您將確定該存儲庫可以正常工作。

您的存儲庫保存在哪里? 如果要保存在某個文件中,則可以將其與某些模型文件(金)進行比較,其中所有文件均已手動檢查並且可以。 如果是某個數據庫,則應模擬數據庫界面,記錄所有插入查詢,然后將日志與理想日志進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM