[英]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()
進行單元測試,但我沒有數據庫詳細信息,因此不確定如何覆蓋contains
和persist
步驟。
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.