Are you using 2.0 still? Or VB? Syntax of 'Isolate.WhenCalled(() => fake.Method()).WillThrow(ex)' should be working for you.
To your questions though, I'm not sure of your exact code outside of this post, so let's see if I can come up with something 'like'.
So the first thing you would need to do is have a fake for the object with the Open method:
ClassWithOpenMethod fake = Isolate.Fake.Instance<ClassWithOpenMethod>(Members.CallOriginal);
The Members.CallOriginal will allow the fake to act just like a real instance of ClassWithOpenMethod - so for all intents and purposes, it's not really a fake - but I digress.
Anyway, now you're going to have Isolator use that fake on the next instance of ClassWithOpenMethod that is created:
Isolate.Swap.NextInstance<ClassWithOpenMethod>().With(fake);
You already have this from before where you throw your exception:
Isolate.Verify.WhenCalled(() => fake.Open()).WillThrow(ex);
So in your code that you posted, you'd have:
[Isolated(), TestMethod()]
public void DBAccessConstructor_InvalidConnectionString_ThrowsSAException
{
//Arrange
SAException saExceptionFake = Isolate.Fake.Instance<SAException>(Members.CallOriginal);
SAConnection saConnectionFake = Isolate.Fake.Instance<SAConnection>();
Isolate.Swap.NextInstance<SAConnection>().With(fake);
Isolate.WhenCalled(() => saConnectionFake.Open()).WillThrow(saExceptionFake);
//Act
try
{
DBAccess target = new DBAccess("whatever");
//Assert
Assert.Fail("Expected Exception");
}
catch(SAException)
{
//Assert
//expected - nothing further to check...
}
}