如何测试调用静态函数的函数-尝试伪造静态函数

时间:2019-03-28 19:00:59

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

请注意,我正在使用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接口指向我要使用的实现。我已经创建了另一个实现,但是不确定如何使用它来代替原始实现。

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

1 个答案:

答案 0 :(得分:0)

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

在单元测试中,我叫objValidation.objHelper = new FakeImplementationClass();

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