Код: Выделить всё
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; }
}
}
Код: Выделить всё
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);
}
}
}
Код: Выделить всё
[TestClass]
public class UnitTest2
{
[TestMethod]
public void TestMethod2()
{
var s = KRSampleManager.Instance;
s.Dispose();
}
}
Добавление журналов указывает на то, что конструктор для KRSampleManager никогда не вызывается, если сначала запускается тест UnitTest1.
Если я изменю имя класса UnitTest1 на UnitTest3, чтобы он выполнялся после UnitTest2, оба модульных теста pass.
Похоже, это проблема с Microsoft Fakes. Если я оставлю классы UnitTest1 и UnitTes2 в отдельном проекте, оба теста пройдут успешно.
В идеале поведение конструктора Shim должно быть ограничено только этим классом. Можно ли каким-либо образом гарантировать, что реальный конструктор объекта будет вызываться, даже если Shim используется в другом классе?
Подробнее здесь: https://stackoverflow.com/questions/790 ... onstructor