Как проверить функцию, которая делает вызов статической функции - пытаясь подделать статическую функцию - PullRequest
0 голосов
/ 28 марта 2019

Обратите внимание, что я тестирую код VB.NET с использованием C #. Я пытаюсь смоделировать интерфейсный вызов, который имеет реализацию, которая вызывает статическую функцию. Я новичок в модульном тестировании в .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 работают правильно, так как они тестируются в предыдущем коде модульного тестирования, хотя я уверен, что мой код довольно плох, поэтому любые предложения будут хорошими.

1 Ответ

0 голосов
/ 28 марта 2019

Я изменил экземпляр переменных на public Private objHelper As IHelper;

и из модульного теста я позвонил objValidation.objHelper = new FakeImplementationClass();

Это помогло мне обойти вызов реализации, которая вызвала базу данных.

...