The examples above is very simplified, but have no fear; the InMemoryAdapter supports all the actions and methods that all the other adapters does; including joins, transactions and even stored procedures. Here are a few examples:
// Configure adapter and insert a record
Database.UseMockAdapter(new InMemoryAdapter());
var db = Database.Open();
db.Test.Insert(Id: 1, Name: "Alice");
// Update record and get number of updated rows
int updated = db.Test.UpdateById(Id: 1, Name: "Allyce");
Assert.AreEqual(1, updated);
// Find and assert the updated record
var record = db.Test.FindById(1);
Assert.AreEqual("Allyce", record.Name);
// Configure adapter and insert a record Database.UseMockAdapter(new InMemoryAdapter()); var db = Database.Open(); db.Test.Insert(Id: 1, Name: "Alice"); // Delete by Id and get the number of deleted records int deleted = db.Test.DeleteById(1); Assert.AreEqual(1, deleted); // Try to find the record and assert that it's gone! var record = db.Test.FindById(1); Assert.IsNull(record);
// Configure adapter and insert 10 records
Database.UseMockAdapter(new InMemoryAdapter());
var db = Database.Open();
for (int i = 0; i < 10; i++)
{
db.Test.Insert(Id: i, Name: "Alice");
}
// Return records OrderBy Id Descending
var records = db.Test.All().OrderByIdDescending().ToList();
// Assert that the first record has Id 9
Assert.AreEqual(9, records[0].Id);
// Configure the adapter with the Master/Detail-relation
// Make sure the naming in the strings here are aligned with the naming used in your code
var adapter = new InMemoryAdapter();
adapter.Join.Master("Customer", "ID").Detail("Order", "CustomerID");
Database.UseMockAdapter(adapter);
// Insert data in the 2 tables
var db = Database.Open();
db.Customer.Insert(ID: 1, Name: "NASA");
db.Customer.Insert(ID: 2, Name: "ACME");
db.Order.Insert(ID: 1, CustomerID: 1, Date: new DateTime(1997, 1, 12));
db.Order.Insert(ID: 2, CustomerID: 2, Date: new DateTime(2001, 1, 1));
// Retrieve the data and use the relation (db.Customer.Order)
var customers = db.Customer.FindAll(db.Customer.Order.Date < new DateTime(1999, 12, 31)).ToList();
Assert.IsNotNull(customers);
Assert.AreEqual(1, customers.Count);
The InMemoryAdapter supports calling into stored procedures. You have to supply a delegate that returns what's expected but that can easily be faked for tests.
In this example we are testing a stored procedure called "Test" with 2 parameters. And the delegate we supply simply returns a Dictionary<string, object> with the values sent to the function. Why a Dictionary<string, object>? Well that's how the rows are stored within the InMemoryAdapter.
var adapter = new InMemoryAdapter();
// Set up the stored procedure
adapter.AddFunction<string, object,
IDictionary<string, object>>("Test", (key, value) =>
new Dictionary<string, object> { { key, value } });
Database.UseMockAdapter(adapter);
var db = Database.Open();
// Call the Test stored procedure (db.Test) and assert the result
foreach (var row in db.Test("Foo", "Bar"))
{
Assert.AreEqual("Bar", row.Foo);
}
// Configure adapater
var adapter = new InMemoryAdapter();
Database.UseMockAdapter(adapter);
var db = Database.Open();
// Insert under transaction and make sure it's returned
using (var tx = db.BeginTransaction())
{
tx.Test.Insert(Id: 1, Name: "Alice");
var record = tx.Test.FindById(1);
Assert.IsNotNull(record);
Assert.AreEqual(1, record.Id);
Assert.AreEqual("Alice", record.Name);
}