Microsoft Fakes и конструктор реальных объектовC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Microsoft Fakes и конструктор реальных объектов

Сообщение Anonymous »

Я использую .NET 4.8 и Microsoft Fakes для создания объекта Shim для модульного тестирования. Этот класс (KRSampleManager) использует отложенную инициализацию для создания экземпляра и реализует интерфейс IDisposable.

Код: Выделить всё

namespace SampleManager
{
public class KRSampleManager : IDisposable
{
private Dictionary _events = null;
private KRSampleManager()
{
_events = new Dictionary();
}

private static readonly Lazy _lazy =
new Lazy
(() => new KRSampleManager());

private bool _isDisposed;

protected virtual void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
{
_isDisposed = true;
}
}

public static KRSampleManager Instance
{
get { return _lazy.Value; }
}

public void Dispose()
{
_events.Clear();
Dispose(true);
GC.SuppressFinalize(this);
}

public int Count()
{
return _events.Count();
}

public bool IsNull()
{ return _events == null; }
}
}
есть еще один класс SampleHandler, который использует класс KRSampleManager

Код: Выделить всё

namespace SampleHandler
{
public class SampleHandler
{
private bool _isnull;
public SampleHandler()
{
_isnull = SampleManager.KRSampleManager.Instance.IsNull();
}
}
}
в одном проекте модульного тестирования есть два класса модульных тестов.
Класс UnitTest1 создает ShimKRSampleManager и пытается создать объект SampleHandler

Код: Выделить всё

 public class UnitTest1
{
[TestMethod]
public void TestMethod3()
{
using (ShimsContext.Create())
{
ShimKRSampleManager.Constructor = (c) => { };
var handler = new SampleHandler.SampleHandler();//SampleHandler.SampleHandler.Instance;
Assert.IsNotNull(handler);
}
}
}
Класс UnitTest2 просто создает реальный экземпляр KRSampleManager и удаляет его.

Код: Выделить всё

 [TestClass]
public class UnitTest2
{
[TestMethod]
public void TestMethod2()
{
var s = KRSampleManager.Instance;
s.Dispose();
}
}
При запуске модульных тестов, если UnitTest1 выполняется первым, то UnitTest2 завершается сбоем с System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта для метода KRSampleManager.Dispose() для _events.Clear ().
Добавление журналов указывает на то, что конструктор для KRSampleManager никогда не вызывается, если сначала запускается тест UnitTest1.
Если я изменю имя класса UnitTest1 на UnitTest3, чтобы он выполнялся после UnitTest2, оба модульных теста pass.
Похоже, это проблема с Microsoft Fakes. Если я оставлю классы UnitTest1 и UnitTes2 в отдельном проекте, оба теста пройдут успешно.
В идеале поведение конструктора Shim должно быть ограничено только этим классом. Можно ли каким-либо образом гарантировать, что реальный конструктор объекта будет вызываться, даже если Shim используется в другом классе?

Подробнее здесь: https://stackoverflow.com/questions/790 ... onstructor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»