2012-09-16 58 views
5

我的問題是我想在我的抽象類中存根屬性,因爲我的測試類使用該屬性。我目前正在使用最新版本的Moq。單元測試繼承自抽象類的類

我的抽象類是這樣的:

public abstract class BaseService 
{ 
    protected IDrawingSystemUow Uow { get; set; } 
} 

和我的測試類是這樣的:

public class UserService : BaseService, IUserService 
{ 
    public bool UserExists(Model model) 
    { 
     var user = this.Uow.Users.Find(model.Id); 
     if(user == null) { return false; } 

     reurn true; 
    } 
} 

我想不通我怎麼能存根Uow財產。有人有任何線索嗎?或者是我的設計不好,我需要移動到Uow屬性我的課在測試?

回答

9

由於一個簡單的原因,您當前的設置不起作用 - Uow屬性是不可覆蓋的,Moq的工作在此時完成。 Cannot override, cannot mock

最簡單的解決方案是簡單地使該屬性覆蓋。基類定義修改爲:

public abstract class BaseService 
{ 
    protected virtual IDrawingSystemUow Uow { get; set; } 
} 

現在你可以使用最小起訂量的保護功能(這需要你,包括你的測試類using Moq.Protected命名空間):

// at the top of the file 
using Moq.Protected; 

// ... 

var drawingSystemStub = new Mock<IDrawingSystemUow>(); 
var testedClass = new Mock<UserService>(); 
testedClass 
    .Protected() 
    .Setup<IDrawingSystemUow>("Uow") 
    .Returns(drawingSystemStub.Object); 

// setup drawingSystemStub as any other stub 

// exercise test 
var result = testedClass.Object.UserExists(...); 
+0

非常感謝您的幫助!這是你的代碼片段中的一個小錯誤。應該用Returns(drawingSystemStub.Object)替換返回值(drawingSystemStub)。 =) – Rikard

+0

@Rikard:謝謝,修正。 –

+0

僅供參考@jimmy_keen - 「無法覆蓋,無法模擬」破解的鏈接 – lukejkw

0

我覺得你的情況是非常簡單。你只是不嘲笑Uow財產,但IDrawingSystemUow服務。因此,您可以創建一個IDrawingSystemUow模擬,通過Uow屬性將其分配給UserService的實例,然後運行測試(例如,UserExists方法)。