簡體   English   中英

如何為構建器設計模式編寫單元測試?

[英]How to write unit test for a builder design pattern?

我正在使用 xunit 進行單元測試,而且我是單元測試的新手。 我有一個生成器 class 如下所示,

public class UserBuilder
{
    private User _user = new User();

    public UserBuilder UserBuilder(IDataBase db) //IDatabase is available in a different Nuget package which I don't have source code access
    {
        this._user.db = db;
    }
    
    public UserBuilder SetName(string name)
    {
        this._user.name = name.ToLower();
    }

    public UserBuilder SetRole(string role)
    {
        this._user.role = role.ToUpper();
    }

   public void Validate()
   {
       if (this._user.name == null)
           throw  new InvalidDataException();
       if (this._user.db.contains(this._user.name)
           throw new InvalidDataException();
       ......
   }

   public User Build()
   {
      this.validate();
      this._user.db.persist();
      return this._user;
}

我想對Build()Validate()SetName()進行單元測試,但我沒有數據庫詳細信息,因此不確定如何覆蓋containspersist步驟。

public class UserBuilderTest
{
    [Fact]
    public void Task_SetName_John()
    {
        // Arrange
        // How to Mock the IDatabase?
        var builder = new UserBuilder(FakeDatabase);

        // Act
        var actual = builder.Validate();

        // Assert
        Assert.Throws<InvalidDataException>(action);
    }   
}

此外,從私有 _user 字段調用 SetName() 后,如何檢查名稱是否為小寫?

public class UserBuilderTest
{
    [Fact]
    public void Task_SetName_John()
    {
        // Arrange
        // How to Mock the IDatabase?
        var builder = new UserBuilder(FakeDatabase);
        var expected = 'john";

        // Act
        var actual = builder.SetName("John");

        // Assert
        Assert.Equals(expected, actual);
    }   
}

我為此使用了 Moq 庫。 https://github.com/moq/moq4

用法看起來像這樣:

var mockDatabase = new Mock<IDataBase>();
// Do setups on the mock if necessary
// mockDatabase.Setup( m => m.SomeMethodOnTheInterface() ).Returns( new Something() );
var builder = new UserBuilder(mockDatabase.Object);

暫無
暫無

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

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