簡體   English   中英

POCO 使用 Moq 進行測試的接口

[英]Interface for POCO to test with Moq

我們有一個只有屬性的 class,這是一種不返回任何東西的測試方法,我們正在使用 Moq 來模擬它的依賴關系。 我們想測試是否設置了 object 的某些屬性。 所以我們嘗試模擬 class 所以稍后我們將使用 Moq 中的 VerifySet 方法,它抱怨該屬性未標記為虛擬也不是接口。 創建一個接口是可行的,我們可以根據需要驗證屬性。 我們是否應該為所有東西創建一個接口,包括像這樣的案例,一個 POCO?

下面我包含一個最小的示例,但實際代碼要大得多。

Class

public class Car
{
    public string Id { get; set; }

    public string Name { get; set; }
}

測試

var mock = Mock<ICar>();

handler.Handle(mock);

mock.VerifySet(x=> x.Name = "Furioso");

方法

public void Handle(Car car)
{
    car.Name = "Furioso"
}

界面

public interface ICar
{
    public string Id { get; set; }

    public string Name { get; set; }
}

我在這里做出假設,但這就是我想要傳達的內容:

var car = new Car(); //no behavior to mock here, just a DTO. You may have to set values to this instance before passing it (or not).

handler.Handle(car); //handler is the instance of the class being tested

//Any other assertions
Assert.Equal("Furioso", car.Name); //I don't use Moq, but whatever is equivalent.

在我看來,您想要assert更改而不是檢查是否已調用setter

真正考慮一下您要在這里測試的內容,例如假設您有一項更改某些屬性的service

public class MyValue {
    public string Value { get; set; }
}

public class MyService {
    
    public void ChangeValues(MyValue value, string toValue) {
    
        value.Value = toValue;
    }
}

如果服務如下所示:

public class MyService {
    
    public void ChangeValues(MyValue value, string toValue) {
    
        value.Value = "toValue";
    }
}

當測試setter是否被調用時,兩種情況都將斷言為 true。

當您斷言對value.Value所做的更改時,只有第一種情況會成功。

暫無
暫無

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

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