visual ver studio numero mostrar lineas linea c# interface mocking moq ienumerable

c# - studio - ver numero de lineas en visual



Enumerar una propiedad de indizador burlado hace que la colección se vacíe (1)

mockWorksheets.Setup(m => m.GetEnumerator()).Returns(fakeWorksheetsList.GetEnumerator());

devuelve la misma instancia de enumerador cada vez que, una vez utilizada, deberá restablecerse (lo que dará como resultado una colección vacía en cualquier enumeración posterior).

Si quiere un nuevo enumerador en cada llamada, debe pasar Returns una expresión lambda:

mockWorkSheets.Setup(m => m.GetEnumerator()).Returns(() => fakeWorksheetsList.GetEnumerator());

Se llamará a la lambda cada vez que se llame a GetEnumerator() . Así que ahora enumerar el simulacro varias veces debería funcionar como se esperaba.

Referencia Moq First () Last () y GetEnumerator () wierdness

De acuerdo, para reproducir, esto es lo que necesitas

public interface IWorkbookSet { IWorkbooks Workbooks { get; } } public interface IWorkbooks : IEnumerable { IWorkbook this[int index] { get; } IWorkbook this[string name] { get; } int Count { get; } } public interface IWorkbook { IWorksheets Worksheets { get; } } public interface IWorksheets : IEnumerable { IWorksheet this[int index] { get; } IWorksheet this[string name] { get; } int Count { get; } IWorksheet Add(); IWorksheet AddAfter(IWorksheet sheet); IWorksheet AddBefore(IWorksheet sheet); bool Contains(IWorksheet worksheet); } public interface IWorksheet { string Name { get; set; } }

Configure una prueba de unidad de Microsoft usando el siguiente código

[TestInitialize] public void Initialize() { List<string> fakeSheetNames = new List<string>() { "Master", "A", "B", "C", "__ParentA", "D", "wsgParentB", "E", "F", "__ParentC", "__ParentD", "G" }; // Worksheets. var fakeWorksheetsList = new List<IWorksheet>(); foreach (string name in fakeSheetNames) { var tmpMock = new Mock<IWorksheet>(); tmpMock.Setup(p => p.Name).Returns(name); tmpMock.Setup(p => p.Visible) .Returns(parentPrefixes.Any(p => name.StartsWith(p)) ? SheetVisibility.Hidden : SheetVisibility.Visible); fakeWorksheetsList.Add(tmpMock.Object); } var mockWorksheets = new Mock<IWorksheets>(); mockWorksheets.Setup(m => m[It.IsAny<int>()]).Returns<int>(index => fakeWorksheetsList[index]); mockWorksheets.Setup(m => m.GetEnumerator()).Returns(fakeWorksheetsList.GetEnumerator()); mockWorksheets.SetupGet(m => m.Count).Returns(fakeWorksheetsList.Count); // Workbook. var mockWorkbook = new Mock<IWorkbook>(); mockWorkbook.Setup(p => p.Name).Returns("Name"); mockWorkbook.Setup(p => p.FullName).Returns("FullName"); mockWorkbook.Setup(p => p.Worksheets).Returns(mockWorksheets.Object); // Workbooks. var fakeWorkbooksList = new List<IWorkbook>() { mockWorkbook.Object }; var mockWorkbooks = new Mock<IWorkbooks>(); mockWorkbooks.Setup(m => m[It.IsAny<int>()]).Returns<int>(index => fakeWorkbooksList[index]); mockWorkbooks.Setup(m => m.GetEnumerator()).Returns(fakeWorkbooksList.GetEnumerator()); mockWorkbooks.SetupGet(m => m.Count).Returns(fakeWorkbooksList.Count); // WorkbookSet. mockWorkbookSet = new Mock<IWorkbookSet>(); mockWorkbookSet.Setup(m => m.Workbooks).Returns(mockWorkbooks.Object); var expectedWorkBooksIndex = 0; var expectedWorkSheetIndex = 1; var expected = fakeWorksheetsList[expectedWorkSheetIndex]; // Setup test. var workbookSet = mockWorkbookSet.Object; var actual = workbookSet .Workbooks[expectedWorkBooksIndex] .Worksheets[expectedWorkSheetIndex]; Assert.AreEqual(expected, actual); Assert.AreEqual(12, workbookSet.Workbooks[0].Worksheets.Count); }

Ahora en un método de prueba, haz esto

[TestMethod] public async Task StrucutreGenerationAsyncTest() { foreach (IWorksheet ws in mockWorkbookSet.Object.Workbooks[0].Worksheets) Trace.WriteLine("1111 ws = " + ws.Name); foreach (IWorksheet ws in mockWorkbookSet.Object.Workbooks[0].Worksheets) Trace.WriteLine("2222 ws = " + ws.Name); }

Salida:

Test Name: StrucutreGenerationAsyncTest Test Outcome: Passed Result StandardOutput: Debug Trace: 1111 ws = Master 1111 ws = A 1111 ws = B 1111 ws = C 1111 ws = __ParentA 1111 ws = D 1111 ws = wsgParentB 1111 ws = E 1111 ws = F 1111 ws = __ParentC 1111 ws = __ParentD 1111 ws = G

El primer foreach enumera IWorksheets , el segundo no (?) Como mockWorkbookSet.Object.Workbooks[0].Worksheets está ahora vacío.

Aún más extraño es esto

[TestMethod] public async Task StrucutreGenerationAsyncTest() { if (mockWorkbookSet.Object.Workbooks[0].Worksheets .Cast<IWorksheet>().Any(ws => ws.Name.Compare("Master"))) Trace.WriteLine("Match!"); foreach (IWorksheet ws in mockWorkbookSet.Object.Workbooks[0].Worksheets) Trace.WriteLine("1111 ws = " + ws.Name); foreach (IWorksheet ws in mockWorkbookSet.Object.Workbooks[0].Worksheets) Trace.WriteLine("2222 ws = " + ws.Name); }

Salida:

Test Name: StrucutreGenerationAsyncTest Test Outcome: Passed Result StandardOutput: Debug Trace: Match! 1111 ws = A 1111 ws = B 1111 ws = C 1111 ws = __ParentA 1111 ws = D 1111 ws = wsgParentB 1111 ws = E 1111 ws = F 1111 ws = __ParentC 1111 ws = __ParentD 1111 ws = G

¿A dónde se ha ido el "Maestro"? Es como si el hecho de enumerar elimina elementos de la colección. ¿Por qué sucede esto y cómo puedo solucionarlo?

Editar # 1 : He intentado burlarme del enumerador usando un método, como sigue

var mockWorksheets = new Mock<IWorksheets>(); mockWorksheets.Setup(m => m[It.IsAny<int>()]).Returns<int>(index => fakeWorksheetsList[index]); mockWorksheets.Setup(m => m.GetEnumerator()).Returns(fakeWorksheetsList.GetEnumerator()); mockWorksheets.SetupGet(m => m.Count).Returns(fakeWorksheetsList.Count);

Con

private IEnumerator<IWorksheet> WorksheetList() { foreach (string name in fakeSheetNames) { var mock = new Mock<IWorksheet>(); mock.Setup(p => p.Name).Returns(name); mock.Setup(p => p.Visible) .Returns(parentPrefixes.Any(p => name.StartsWith(p)) ? SheetVisibility.Hidden : SheetVisibility.Visible); yield return mock.Object; } }

Esto no ayuda.