【问题标题】:How to test a function that makes a call to a static function - trying to fake static function如何测试调用静态函数的函数 - 尝试伪造静态函数
【发布时间】:2019-03-28 19:00:59
【问题描述】:

请注意,我正在使用 C# 对 VB.NET 代码进行单元测试。我正在尝试模拟一个接口调用,该接口调用具有调用静态函数的实现。我是 .NET 中的单元测试和一般模拟/伪造的新手。

我曾尝试使用 moq 和 Microsoft Fakes 框架,但不知道具体如何实现。

项目 1(静态)- 无法更改:

Public Class CommonCode
    Private Sub New()
    End Sub

    Public Shared Function HelpFunction(objContext, objString) As Integer
        Using objCmd As SqlCommand = objContext.DbConnection.CreateCommand()
            'code - db call
            return number
        End Using
    End Function
End Class

项目 2:

Public Class Validate
    Private objHelper As IHelper

    Public Function GetErrors(objContext, objString) As String
        If objHelper.GetHelp(objContext, objString) < 1
            Return "ERROR"
        End If
    End Function
End Class

我尝试添加一个接口来帮助伪造这个函数,因为我发现我无法伪造一个静态函数。

Public Interface IHelper
    Public Function GetHelp(objContext, objString) As Integer
End Interface
Public Class Helper Implements IHelper
    Public Function GetHelp(objContext, objString) As Integer
        Return CommonCode.HelpFunction(objContext, objString)
    End Function
End Class

测试用例(请注意,大多数这些项目都用于其他测试,所以请记住这一点)

[TestClass]
public class RTATAXSTATUS_01_PRC_Validation_Test
{
    ShimMainObj shimTestObj;
    MainObj testObj;
    Validate objValidation;
    Mock<IHelper> mockHelper;
    IDisposable shimContext;
    bool blnIsValid;

    [TestInitialize]
    public void SetUp()
    {
        mockHelper= new Mock<IHelper>();
        shimContext = ShimsContext.Create();
        shimTestObj= new ShimTest();
        testObj = shimTestObj.Instance;
        objValidation = new Validate ();
        blnIsValid = true;
    }

    [TestCleanup]
    public void TearDown()
    {
        shimContext.Dispose();
    }

    [TestMethod]
    public void Test_StreamID_ExistsInPetrinex()
    {
        string strId = "TESTME";

        //for other validation in the GetErrors function
        shimTestObj.Value = () => { return strId); };

        mockHelper.Setup(m => m.GetHelp(null, strId)).Returns(1234);

        string strMsgs = objValidation.GetErrors(null, testObj.Value);

        Assert.IsFalse(blnIsValid, "Errors should have been found.");
        Assert.IsTrue(strMsgs.Contains("ERROR"));
    }
}

这最终会返回 NullReferenceException,因为在尝试使用 objContext 时,它会将对象视为空对象。任何想法都将不胜感激,我只是没有继续进行的知识,也无法在网上找到任何对我有用的东西。

我想知道是否有可能在我的测试项目中有此接口的另一个实现,并以某种方式强制我的 GetHelp 接口指向我想要使用的实现。我已经创建了另一个实现,但不确定如何使用它来代替原来的实现。

请注意,Shims 可以正常工作,因为它们正在之前的单元测试代码中进行测试,尽管我确信我的代码很糟糕,所以任何建议都会很好。

【问题讨论】:

  • 我不是 vb.net 专家,但通常您通过替换他们的合作者(输入、输出、上下文等)来测试方法。在这种情况下,如果您尝试测试HelpFunction,您可能可以用测试数据库替换它正在运行的数据库,并且您可以在数据库中设置一个测试用例,然后在调用后验证数据库已按您预期的方式进行了更改。
  • @Gus 嗨,Gus,我正在尝试在 Validate 类中测试 GetErrors 函数。该函数之前调用了HelpFunction,但我在Validate 类和CommonCode 之间放置了一个接口,以允许我伪造这种交互。我不想接触数据库,数据库调用调用了一个没有适当安全性的函数将无法运行。我只是想伪造从数据库返回的结果,即伪造 HelpFunctionGetHelp 函数返回的内容。

标签: c# vb.net unit-testing moq microsoft-fakes


【解决方案1】:

我将变量实例更改为公共Private objHelper As IHelper;

在单元测试中我调用了objValidation.objHelper = new FakeImplementationClass();

这对我来说可以绕过对调用数据库的实现的调用。

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 2010-10-10
    • 1970-01-01
    • 2013-04-09
    • 2011-10-04
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多