public static IVsSolution CreateSolution(TreeItem root) { Mock <IVsSolution> solution; IEnumHierarchies enumerator; solution = new Mock <IVsSolution>(); solution .Setup((x) => x.GetGuidOfProject(It.IsAny <IVsHierarchy>(), out It.Ref <Guid> .IsAny)) .Returns(new GetGuidOfProject((IVsHierarchy hierarchy, out Guid guid) => { foreach (var node in root.DescendantsAndSelf()) { if (node.Hierarchy == hierarchy) { guid = node.Data.Identifier; return(VSConstants.S_OK); } } guid = default; return(VSConstants.E_FAIL); })); solution .Setup((x) => x.GetProjectOfGuid(ref It.Ref <Guid> .IsAny, out It.Ref <IVsHierarchy?> .IsAny)) .Returns(new GetProjectOfGuid((ref Guid guid, out IVsHierarchy? hierarchy) => { foreach (var node in root.DescendantsAndSelf()) { if (node.Data.Identifier == guid) { hierarchy = EnsureHierarchyExists(node, solution.Object); return(VSConstants.S_OK); } } hierarchy = null; return(VSConstants.E_FAIL); })); solution .Setup((x) => x.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_ALLINSOLUTION, ref It.Ref <Guid> .IsAny, out enumerator)) .Returns(new GetProjectEnum((uint flags, ref Guid type, out IEnumHierarchies enumerator) => { enumerator = CreateHierarchyEnumerator(root, solution.Object); return(VSConstants.S_OK); })); solution .As <IVsSolution4>() .Setup((x) => x.ReloadProject(ref It.Ref <Guid> .IsAny)) .Returns(new ReloadProjectCallback((ref Guid identifier) => { foreach (var item in root.Descendants()) { if (item.Data.Identifier == identifier) { SetType(item, HierarchyType.Project); return(VSConstants.S_OK); } } return(VSConstants.E_FAIL); })); solution .As <IVsSolution4>() .Setup((x) => x.UnloadProject(ref It.Ref <Guid> .IsAny, (uint)_VSProjectUnloadStatus.UNLOADSTATUS_UnloadedByUser)) .Returns(new UnloadProjectCallback((ref Guid identifier, uint status) => { foreach (var item in root.Descendants()) { if (item.Data.Identifier == identifier) { SetType(item, HierarchyType.UnloadedProject); return(VSConstants.S_OK); } } return(VSConstants.E_FAIL); })); solution.As <IVsHierarchy>(); return(solution.Object); }