1
我通常嘲笑IDpecmentSession在我的MSpec與Machine.Fakes,RavenDB傢伙不喜歡。如何在Machine.Fakes中使用EmbeddableDocumentStore?使用Machine.Fakes單元測試與RavenDB EmbeddableDocumentStore
我通常嘲笑IDpecmentSession在我的MSpec與Machine.Fakes,RavenDB傢伙不喜歡。如何在Machine.Fakes中使用EmbeddableDocumentStore?使用Machine.Fakes單元測試與RavenDB EmbeddableDocumentStore
要點:https://gist.github.com/JasonMore/5345697
掛鉤RavenDB InMemory到Machine.Fakes
public class RavenInMemorySlowRunner
{
public class NoStaleQueriesAllowed : IDocumentQueryListener
{
public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization)
{
queryCustomization.WaitForNonStaleResults();
}
}
public class AllDocumentsById : AbstractIndexCreationTask
{
public override IndexDefinition CreateIndexDefinition()
{
return new IndexDefinition
{
Name = "AllDocumentsById",
Map = "from doc in docs let DocId = doc[\"@metadata\"][\"@id\"] select new {DocId};"
};
}
}
public static EmbeddableDocumentStore Store { get; set; }
public static IDocumentSession Session { get; set; }
OnEstablish context = fakeAccessor =>
{
fakeAccessor.Configure(x => x.For<IDocumentSession>().Use(() =>
{
if (Store == null)
{
Store = new EmbeddableDocumentStore { RunInMemory = true };
Store.RegisterListener(new NoStaleQueriesAllowed());
Store.Initialize();
// RegisterServicesWithNinject is in the project where the indexes live
IndexCreation.CreateIndexes(typeof(RegisterServicesWithNinject).Assembly, Store);
IndexCreation.CreateIndexes(typeof(RavenInMemorySlowRunner).Assembly, Store);
}
if (Session == null)
{
Session = Store.OpenSession();
}
return Session;
}));
};
OnCleanup subject = subject =>
{
Session.Advanced.DocumentStore.DatabaseCommands.DeleteByIndex("AllDocumentsById", new IndexQuery());
Session.SaveChanges();
Session.Dispose();
};
}
測試
public class CurrentSiteModelServiceSpecs : WithSubject<CurrentSiteModelService>
{
Establish that =() =>
{
// use the raven in memory runner since
// we are using lots of raven magic in this service
With(new RavenInMemorySlowRunner());
};
}
/// <summary>
/// Determine Site Model for Dev
/// </summary>
public class When_Determining_SiteModel_for_dev : CurrentSiteModelServiceSpecs
{
public static SiteViewModel _siteViewModelResult;
public static IHttpCookie _cookie;
Because of =() =>
_siteViewModelResult = Subject.DetermineSiteModelForDevEnvironment();
}
public class And_Cookie_not_set : When_Determining_SiteModel_for_dev
{
It returns_null =() =>
_siteViewModelResult.ShouldBeNull();
}
public class And_Cookie_set : When_Determining_SiteModel_for_dev
{
Establish that =() =>
{
_cookie = An<IHttpCookie>();
_cookie.Value = "site/123";
The<ICookieService>()
.WhenToldTo(x => x.GetCookie(".CMS3DevSite"))
.Return(_cookie);
var site1 = new SiteModel{ Id = "site/123", HostName = "foo" };
var site2 = new SiteModel{ Id = "site/456", HostName = "bar" };
The<IDocumentSession>().Store(site1);
The<IDocumentSession>().Store(site2);
The<IDocumentSession>().SaveChanges();
};
It loads_site =() =>
_siteViewModelResult.HostName.ShouldEqual("foo");
}
public class And_Cookie_set_but_site_does_not_exist : When_Determining_SiteModel_for_dev
{
Establish that =() =>
{
_cookie = An<IHttpCookie>();
_cookie.Value = "site/123";
The<ICookieService>()
.WhenToldTo(x => x.GetCookie(".CMS3DevSite"))
.Return(_cookie);
};
It returns_null =() =>
_siteViewModelResult.ShouldBeNull();
}
的服務我測試
public interface ICurrentSiteModelService RedirectToResult SetSiteModel(string path,Uri url); }
public class CurrentSiteModelService : ICurrentSiteModelService
{
readonly IDocumentSession _documentSession;
readonly ICookieService _cookieService;
public CurrentSiteModelService(
IDocumentSession documentSession,
ICookieService cookieService)
{
_documentSession = documentSession;
_cookieService = cookieService;
}
// cruft removed here
// load site in dev mode based on cookie.
internal SiteViewModel DetermineSiteModelForDevEnvironment()
{
var cookie = _cookieService.GetCookie(".CMS3DevSite");
if (cookie != null && !String.IsNullOrEmpty(cookie.Value))
{
SiteViewModel site = _documentSession.
Query<SiteViewModel, SiteViewIndex>()
.Where(s => s.Id == cookie.Value)
.AsProjection<SiteViewModel>()
.FirstOrDefault();
if (site != null)
{
return site;
}
}
return null;
}
}
嗨Jason。整潔的東西,但請記住,StackOverflow是關於提問的問題。我有很多我和別人分享的很酷的代碼,但是有更合適的地方。您可以考慮[RavenDB Google Group](https://groups.google.com/forum/?fromgroups#!forum/ravendb),博客文章,GitHub上的項目,或將其貢獻給[RavenDB.Contrib] (https://github.com/ravendb/ravendb.contrib)項目。 – 2013-04-09 15:25:21
我試圖做一個社區維基。我如何設置? – 2013-04-09 19:08:14
from http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ - 「底線 - 不要猶豫,問任何問題並回答你自己的問題堆棧交換站點「。 ??? – 2013-04-09 19:09:47