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