My original answer referred the OP to my \fauxsc macro, but that is not what the OP wanted. Importantly, the OP wants the discernment of the availability of small caps in the font to be automatic.
So I revised the answer to provide \detectsc to detect the presence of small caps or not. It works by assuming that an invocation of \textsc in the absence of small caps gets converted to an \textup equivalent. To detect this situation, it places, in two respective boxes, \textsc{i} and \textup{i}. It then compares the width and height of these two boxes. If they are the same, the small caps must be missing, and so it \let\textsc\uppercase, which is the behavior desired by the OP in the absence of a small caps font.
REEDITED so that if a valid sc font is detected by \detectsc, the original definition of \textsc is restored or left intact, as the case may be. This is important if sc is valid in one font family but not another.
Here is my MWE, which can be compiled under pdflatex (uses lmodern) and the xelatex (uses Myriad Pro), with two different results:
\documentclass{article}
\usepackage{ifxetex}
\ifxetex
\def\compiler{XeLaTeX}
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text}
\setsansfont{Myriad Pro}
\else
\def\compiler{pdfLaTeX}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\fi
\let\svtextsc\textsc
\newcommand\detectsc{%
\setbox0=\hbox{\textsc{i}}%
\setbox2=\hbox{\textup{i}}%
\let\textsc\svtextsc%
\ifdim\wd0=\wd2\ifdim\ht0=\ht2\let\textsc\uppercase\fi\fi
}
\begin{document}
Compiler: \compiler
\sffamily
%\itshape% ALSO WORKS IF ITSHAPE ACTIVATED
\detokenize{\sffamily:}\par
\textsc{Abc} before \detokenize{\detectsc}\par
\detectsc \textsc{Abc} after \detokenize{\detectsc}\par
Resetting \detokenize{\textsc}\rmfamily\let\textsc\svtextsc\par
\detokenize{\rmfamily:}\par
\textsc{Abc} before \detokenize{\detectsc}\par
\detectsc \textsc{Abc} after \detokenize{\detectsc}
\end{document}
Here (with lmodern), detecting the distinction between \textsc and \textup, it leaves \textsc intact.

But under xelatex (with Myriad Pro sans), it detects no distinction in \sffamily between \textup and \textsc, and so it redefines \textsc to be \uppercase. However, in \rmfamily, it will reinstate or leave intact \textsc{} definition.

\fauxscin that case: http://tex.stackexchange.com/questions/230334/description-environment-overrides-font-style/230336#230336. A local reassignment of\let\textsc\fauxscin such cases would allow the old syntax to be used. – Steven B. Segletes Mar 24 '15 at 21:40