Можно ли с помощью MSFakes переназначить экземпляр "this" в перезаписанном ShimNotMyClass.AllInstances.MyMethod? - PullRequest
0 голосов
/ 24 октября 2019

На самом деле я хочу протестировать различные варианты поведения объекта класса, который для меня не изменяется, с помощью модульного теста. Я знаю, что класс спроектирован как класс PersonData в следующем фрагменте:

namespace NotMyNamespace.Library
{
    public class PersonData
    {
        public string Name { get; set; }

        public PersonData()
        {
            this.Name = "Defaultname after construction";
        }

        private void Load()
        {
            this.Name = "Loaded from DataBase";
            return;
        }

        public bool Reload()
        {
            this.Load();
            return true;
        }
    }
}

Я хочу "перезаписать" метод "Обновить" с помощью прокладки, чтобы избежать получения данных из базы данных. Я просто хочу восстановить свои собственные тестовые объекты.

namespace MSFakesTest.MyTests
{
    [TestFixture]
    public class UnitTest 
    {
        //preperation
        private void ShimDatabaseAccess1()
        {
            NotMyNamespace.Library.Fakes.ShimPersonData.AllInstances.Load = (@this) =>
            {
                var localTestData = new PersonData()
                {
                    Name = "Loaded from Testdata"
                };

                @this = localTestData;

                //this is possible but i want to reassign the reference. not the values
                //@this.Name = "Set as value"
            };
        }

        [Test]
        public void TestWithShim1()
        {
            using (ShimsContext.Create())
            {
                //Arrange
                ShimDatabaseAccess1();
                //ShimDatabaseAccess2();
                var classInstance = new PersonData();

                //Act
                classInstance.Reload();

                //Assert
                Assert.That(classInstance.Name, Is.EqualTo("Loaded from Testdata"));   
                //but classInstance.Name is "Defaultname after construction"
            }
        }
    }
}

Проблема уже упоминалась в комментариях

Похоже, что экземпляр "this" является клоном, а не реальным объектом, и, возможно, только переменные типа значения копируются после выходаметод.

...