簡體   English   中英

單元測試從抽象類繼承的類

[英]Unit testing a class that inherits from an abstract class

我的問題是我想在我的抽象類中存根一個屬性,因為我在測試中的類使用了該屬性。 我目前正在使用最新版本的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屬性轉移到我的班級?

您當前的設置不會出於一個簡單的原因 - Uow屬性是不可Uow ,Moq的工作就在此時完成。 無法覆蓋,無法模擬

最簡單的解決方案是簡單地使該屬性可以覆蓋。 將基類定義更改為:

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

現在您可以使用Moq的受保護功能(這要求您在測試類中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(...);

我認為在你的情況下它非常簡單。 你只是不模仿Uow屬性,而是IDrawingSystemUow服務。 因此,您可以創建IDrawingSystemUow的模擬,通過Uow屬性將其分配給UserService的實例,然后運行測試(例如UserExists方法)。

暫無
暫無

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

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