Unit tests are white-box tests and usually written by the developers of the thing being tested. The first means that you need first-class interaction with the APIs and objects and values of the language the actual product is written in, which rules out almost all combinations of languages. In fact, I think the CLR is the only agglomeration of languages that each can call into each other perfectly. And as you say, most CLR languages are so similar that none of the advantages you suggest apply.
That leaves pretty much only the combination of F# and C#/VB.NET. I can imagine several reasons this hasn't taken off:
- F# doesn't have that big of a community. Conversely, most C# developers don't know enough F# to even consider this.
- The people who do know F# are either busy writing both unit tests and actual code in F#, or in a team where they can't use F# at all because nobody else knows it (well). As mentioned before, unit tests are usually not written by a separate team, so people who write C# unit tests for F# code probably still have to know F#. Plus the whole white-box thing: If you don't know a thing about functional programming, even the data structures and APIs exposed by (idiomatic) F# will be unnatural for you once you delve deeper than very simple libraries of the form "put in a URL here, receive
IEnumerable<UrlParameter>. - There's no benefit, or (or people don't believe the benefit), but quite possibly some very real friction from switching languages constantly.